home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume25 / trash / part07 < prev    next >
Encoding:
Text File  |  1992-03-23  |  54.1 KB  |  2,484 lines

  1. Newsgroups: comp.sources.unix
  2. From: bruce@beta.cs.su.oz.au (Bruce Janson)
  3. Subject: v25i161: trash - simulate process execution in MIPS RISC/os 4.52, Part07/08
  4. Sender: unix-sources-moderator@pa.dec.com
  5. Approved: vixie@pa.dec.com
  6.  
  7. Submitted-By: bruce@beta.cs.su.oz.au (Bruce Janson)
  8. Posting-Number: Volume 25, Issue 161
  9. Archive-Name: trash/part07
  10.  
  11. #! /bin/sh
  12. # This is a shell archive.  Remove anything before this line, then unpack
  13. # it by saving it into a file and typing "sh file".  To overwrite existing
  14. # files, type "sh file -c".  You can also feed this as standard input via
  15. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  16. # will see the following message at the end:
  17. #        "End of archive 7 (of 8)."
  18. # Contents:  bsd43.c
  19. # Wrapped by bruce@basser on Tue Mar  3 23:25:24 1992
  20. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  21. if test -f 'bsd43.c' -a "${1}" != "-c" ; then 
  22.   echo shar: Will not clobber existing file \"'bsd43.c'\"
  23. else
  24. echo shar: Extracting \"'bsd43.c'\" \(51326 characters\)
  25. sed "s/^X//" >'bsd43.c' <<'END_OF_FILE'
  26. X#include        <bsd43/sys/syscall.h>
  27. X#include        <bsd43/sys/param.h>
  28. X#include        <bsd43/sys/types.h>
  29. X#include        <bsd43/sys/vfs.h>
  30. X#include        <bsd43/sys/time.h>
  31. X#include        <bsd43/sys/resource.h>
  32. X#include        <bsd43/sys/ioctl.h>
  33. X#include        <bsd43/sys/stat.h>
  34. X#include        <bsd43/sys/file.h>
  35. X#include        <bsd43/sys/socket.h>
  36. X#include        <bsd43/sys/uio.h>
  37. X#include        <bsd43/sys/wait.h>
  38. X#include        <bsd43/sys/sysmips.h>
  39. X#include        <bsd43/mips/hwconf.h>
  40. X#define    NFSCLIENT
  41. X#include        <bsd43/sys/mount.h>
  42. X#undef    NFSCLIENT
  43. X#include        <bsd43/rpc/types.h>
  44. X#include        <bsd43/rpc/auth.h>
  45. X#include        <bsd43/nfs/nfs.h>
  46. X#include        <bsd43/netinet/in.h>
  47. X#include        <bsd43/nfs/nfs_clnt.h>
  48. X#include        <bsd43/nfs/export.h>
  49. X#include        <bsd43/fcntl.h>
  50. X#include        <bsd43/signal.h>
  51. X#include        <fcntl.h>
  52. X#include        <errno.h>
  53. X#include        <stdio.h>
  54. X#include        "register.h"
  55. X#include        "symtab.h"
  56. X#include        "diblock.h"
  57. X#include        "instrn.h"
  58. X#include        "process.h"
  59. X#include        "sysentry.h"
  60. X#include        "res.h"
  61. X#include        "nels.h"
  62. X#include        "flag.h"
  63. X#include        "generic.h"
  64. X
  65. Xextern int        fd_lookup();
  66. Xextern int        fd_open();
  67. Xextern void        fd_dopen();
  68. Xextern int        fd_close();
  69. Xextern int        fd_sort();
  70. Xextern void        histo_dump();
  71. Xextern void        hist_dump();
  72. Xextern char        *strdup();
  73. Xextern int        bufset();
  74. Xextern int        mstrlen();
  75. Xextern int        mgetstring();
  76. Xextern int        mgets();
  77. Xextern char        **mgetvp();
  78. Xextern int        mfreevp();
  79. Xextern int        augment_execve_args();
  80. Xextern int        mget();
  81. Xextern int        mput();
  82. Xextern void        say_time();
  83. Xextern char        *proc_text_address();
  84. Xextern char        *signal_set();
  85. Xextern int        sysv_sys_ioctl();
  86. X
  87. Xextern FILE        *outfp;
  88. Xextern int        errno;
  89. X
  90. Xextern int        Fflag;
  91. X
  92. Xextern unsigned long    arg[];
  93. X
  94. Xextern int        return_errno;    /* errno goes here. */
  95. Xextern long        return_value0;    /* Result 1 value goes here. */
  96. Xextern long        return_value1;    /* Result 2 value goes here. */
  97. X
  98. Xextern sysentry        *current_sysentp;
  99. Xextern char        *sys_call_buf;    /* Scratch buf. */
  100. X
  101. Xstatic
  102. Xint
  103. Xsys_adjtime(syscallno)
  104. Xint    syscallno;
  105. X{
  106. X    struct bsd43_timeval    tv;
  107. X    struct bsd43_timeval    otv;
  108. X
  109. X    return generic_adjtime(syscallno, &tv, sizeof(tv), &otv, sizeof(otv));
  110. X}
  111. X
  112. Xstatic
  113. Xint
  114. Xsys_dup2(syscallno)
  115. Xint    syscallno;
  116. X{
  117. X    int    old_real_fd;
  118. X
  119. X    Rstart;
  120. X    return_value0 = syscall(BSD43_SYS_dup, fd_lookup((int)arg[0]));
  121. X    return_errno = errno;
  122. X    Rstop;
  123. X
  124. X    if (return_value0 == -1)
  125. X        return 0;
  126. X
  127. X    if ((old_real_fd = fd_lookup((int)arg[1])) != -1)
  128. X    {
  129. X        (void)close(old_real_fd);
  130. X        (void)fd_close((int)arg[1]);
  131. X    }
  132. X
  133. X    fd_dopen(return_value0, (int)arg[1]);
  134. X
  135. X    return_value0 = (int)arg[1];
  136. X
  137. X    return 0;
  138. X}
  139. X
  140. Xstatic
  141. Xint
  142. Xsys_execve(syscallno)
  143. Xint    syscallno;
  144. X{
  145. X    char    *filename;
  146. X    char    **argp;
  147. X    char    **envp;
  148. X    int    need_close_on_exec;
  149. X
  150. X    if (mgetstring(arg[0]) == -1)
  151. X        return -1;
  152. X
  153. X    if ((filename = strdup(sys_call_buf)) == (char *)0)
  154. X    {
  155. X        vcouldnot("execve(): ran out of memory");
  156. X        return -1;
  157. X    }
  158. X
  159. X    if ((argp = mgetvp(arg[1])) == (char **)0)
  160. X        return -1;
  161. X
  162. X    if ((envp = mgetvp(arg[2])) == (char **)0)
  163. X        return -1;
  164. X
  165. X    if (fd_sort() == -1)
  166. X        return -1;
  167. X
  168. X    if (Fflag)
  169. X    {
  170. X        int    mok;
  171. X
  172. X        if
  173. X        (
  174. X            syscall(BSD43_SYS_access, filename, BSD43_X_OK) != 0
  175. X            ||
  176. X            (mok = magic_ok(filename)) == 0
  177. X            ||
  178. X            (mok == 2 && interpreter_ok(filename) == 0)
  179. X            ||
  180. X            is_a_shared_library(filename)
  181. X        )
  182. X        {
  183. X            return_value0 = -1;
  184. X            return_errno = errno;
  185. X
  186. X            if (mfreevp(envp) == -1)
  187. X                return -1;
  188. X
  189. X            if (mfreevp(argp) == -1)
  190. X                return -1;
  191. X
  192. X            (void)free(filename);
  193. X
  194. X            return 0;
  195. X        }
  196. X
  197. X        if (augment_execve_args(&filename, &argp, &envp) == -1)
  198. X        {
  199. X            (void)mfreevp(envp);
  200. X            (void)mfreevp(argp);
  201. X            (void)free(filename);
  202. X        }
  203. X
  204. X        need_close_on_exec = 0;
  205. X    }
  206. X    else
  207. X    {
  208. X        histo_dump();
  209. X        hist_dump();
  210. X
  211. X        if (fcntl(fileno(outfp), F_SETFD, 1) == -1)
  212. X        {
  213. X            vcouldnot("fcntl(%d, F_SETFD, 1)", fileno(outfp));
  214. X            return -1;
  215. X        }
  216. X
  217. X        need_close_on_exec = 1;
  218. X    }
  219. X
  220. X    Rstart;
  221. X    return_value0 = syscall(syscallno, filename, argp, envp);
  222. X    return_errno = errno;
  223. X    Rstop;
  224. X
  225. X    if (need_close_on_exec)
  226. X    {
  227. X        if (fcntl(fileno(outfp), F_SETFD, 0) == -1)
  228. X        {
  229. X            vcouldnot("fcntl(%d, F_SETFD, 0)", fileno(outfp));
  230. X            return -1;
  231. X        }
  232. X    }
  233. X
  234. X    if (mfreevp(envp) == -1)
  235. X        return -1;
  236. X
  237. X    if (mfreevp(argp) == -1)
  238. X        return -1;
  239. X
  240. X    (void)free(filename);
  241. X
  242. X    return 0;
  243. X}
  244. X
  245. Xstatic
  246. Xint
  247. Xsys_exportfs(syscallno)
  248. Xint    syscallno;
  249. X{
  250. X    char        *dirnamep;
  251. X    char        dirname[1024];
  252. X    struct export    exent;
  253. X    struct export    *exp;
  254. X    int        first_length;
  255. X    int        write_length;
  256. X
  257. X    if (mgets(arg[0], &dirnamep) == -1)
  258. X        return -1;
  259. X
  260. X    if (dirnamep != (char *)0)
  261. X    {
  262. X        (void)strcpy(&dirname[0], dirnamep);
  263. X        dirnamep = &dirname[0];
  264. X    }
  265. X
  266. X    if (arg[1] == (unsigned long)0)
  267. X        exp = (struct export *)0;
  268. X    else
  269. X    {
  270. X        if (quiet_procmget(GLOBALdipc, (unsigned long)arg[1], &exent, sizeof(exent)) == -1)
  271. X            return -1;
  272. X
  273. X        if (exent.ex_flags & EX_RDMOSTLY)
  274. X        {
  275. X            write_length = exent.ex_writeaddrs.naddrs * sizeof(struct bsd43_sockaddr);
  276. X#if    0
  277. Xfprintf(stderr, "writenaddrs = %d, write_length = %d\n", exent.ex_writeaddrs.naddrs, write_length);
  278. X#endif    /* 0 */
  279. X        }
  280. X        else
  281. X            write_length = 0;
  282. X
  283. X        switch (exent.ex_auth)
  284. X        {
  285. X        case AUTH_UNIX:
  286. X            first_length = exent.ex_u.exunix.rootaddrs.naddrs * sizeof(struct bsd43_sockaddr);
  287. X#if    0
  288. Xfprintf(stderr, "rootnaddrs = %d, root_length = %d\n", exent.ex_u.exunix.rootaddrs.naddrs, first_length);
  289. X#endif    /* 0 */
  290. X
  291. X            if (bufset((unsigned int)(first_length + write_length)) == -1)
  292. X                return -1;
  293. X
  294. X            if (quiet_procmget(GLOBALdipc, (unsigned long)exent.ex_u.exunix.rootaddrs.addrvec, sys_call_buf, first_length) == -1)
  295. X                return -1;
  296. X
  297. X            exent.ex_u.exunix.rootaddrs.addrvec = (struct sockaddr *)sys_call_buf;
  298. X            break;
  299. X
  300. X        case AUTH_DES:
  301. X            /*
  302. X             * No thanks -- I'll wait till I see it used.
  303. X             */
  304. X            return -2;
  305. X
  306. X        default:
  307. X            return -2;
  308. X        }
  309. X
  310. X        if (exent.ex_flags & EX_RDMOSTLY)
  311. X        {
  312. X            if (quiet_procmget(GLOBALdipc, (unsigned long)exent.ex_writeaddrs.addrvec, sys_call_buf + first_length, write_length) == -1)
  313. X                return -1;
  314. X
  315. X            exent.ex_writeaddrs.addrvec = (struct sockaddr *)(sys_call_buf + first_length);
  316. X        }
  317. X
  318. X        exp = &exent;
  319. X    }
  320. X
  321. X    Rstart;
  322. X    return_value0 = syscall(syscallno, dirnamep, exp);
  323. X    return_errno = errno;
  324. X    Rstop;
  325. X
  326. X    return 0;
  327. X}
  328. X
  329. Xstatic
  330. Xint
  331. Xsys_fcntl(syscallno)
  332. Xint    syscallno;
  333. X{
  334. X    switch ((int)arg[1])
  335. X    {
  336. X    case BSD43_F_DUPFD:
  337. X        Rstart;
  338. X        return_value0 = syscall(BSD43_SYS_dup, fd_lookup((int)arg[0]));
  339. X        return_errno = errno;
  340. X        Rstop;
  341. X
  342. X        if (return_value0 != -1)
  343. X        {
  344. X            int    newfd;
  345. X            int    nfiles;
  346. X
  347. X            for (nfiles = fd_nfiles(), newfd = (int)arg[2]; newfd < nfiles && fd_lookup(newfd) != -1; newfd++)
  348. X                ;
  349. X
  350. X            if (newfd >= nfiles)
  351. X            {
  352. X                (void)close(return_value0);
  353. X                errno = EMFILE;
  354. X                return 0;
  355. X            }
  356. X
  357. X            fd_dopen(return_value0, newfd);
  358. X
  359. X            return_value0 = newfd;
  360. X        }
  361. X        break;
  362. X
  363. X    case BSD43_F_GETFD:
  364. X    case BSD43_F_SETFD:
  365. X    case BSD43_F_GETFL:
  366. X    case BSD43_F_SETFL:
  367. X    case BSD43_F_SETOWN:
  368. X        Rstart;
  369. X        return_value0 = syscall(syscallno, fd_lookup((int)arg[0]), (int)arg[1], (int)arg[2]);
  370. X        return_errno = errno;
  371. X        Rstop;
  372. X        break;
  373. X
  374. X    default:
  375. X        return -2;
  376. X    }
  377. X
  378. X    return 0;
  379. X}
  380. X
  381. Xstatic
  382. Xint
  383. Xsys_fstat(syscallno)
  384. Xint    syscallno;
  385. X{
  386. X    return generic_fstat(syscallno, sizeof(struct bsd43_stat));
  387. X}
  388. X
  389. Xstatic
  390. Xint
  391. Xsys_fstatfs(syscallno)
  392. Xint    syscallno;
  393. X{
  394. X    struct bsd43_statfs    *bufp;
  395. X
  396. X    if (dmget(arg[1], sizeof(*bufp), &bufp) == -1)
  397. X        return -1;
  398. X
  399. X    Rstart;
  400. X    return_value0 = syscall(syscallno, arg[0], bufp);
  401. X    return_errno = errno;
  402. X    Rstop;
  403. X
  404. X    if (mput(arg[1], bufp, sizeof(*bufp), return_value0) == -1)
  405. X        return -1;
  406. X
  407. X    return 0;
  408. X}
  409. X
  410. Xstatic
  411. Xint
  412. Xsys_getgid(syscallno)
  413. Xint    syscallno;
  414. X{
  415. X    /*
  416. X     * TODO: second return value for BSD43 getgid().
  417. X     */
  418. X    Rstart;
  419. X    return_value0 = syscall(syscallno);
  420. X    return_value1 = getegid();    /* Not really correct. */
  421. X    return_errno = errno;
  422. X    Rstop;
  423. X
  424. X    return 0;
  425. X}
  426. X
  427. Xstatic
  428. Xint
  429. Xsys_getgroups(syscallno)
  430. Xint    syscallno;
  431. X{
  432. X    return generic_getgroups(syscallno, BSD43_NGROUPS);
  433. X}
  434. X
  435. Xstatic
  436. Xint
  437. Xsys_getitimer(syscallno)
  438. Xint    syscallno;
  439. X{
  440. X    return generic_getitimer(syscallno, sizeof(struct bsd43_itimerval));
  441. X}
  442. X
  443. Xstatic
  444. Xint
  445. Xsys_getpgrp(syscallno)
  446. Xint    syscallno;
  447. X{
  448. X    Rstart;
  449. X    return_value0 = syscall(syscallno, (int)arg[0]);
  450. X    return_errno = errno;
  451. X    Rstop;
  452. X
  453. X    return 0;
  454. X}
  455. X
  456. Xstatic
  457. Xint
  458. Xsys_getrlimit(syscallno)
  459. Xint    syscallno;
  460. X{
  461. X    return generic_getrlimit(syscallno, sizeof(struct bsd43_rlimit));
  462. X}
  463. X
  464. Xstatic
  465. Xint
  466. Xsys_getrusage(syscallno)
  467. Xint    syscallno;
  468. X{
  469. X    return generic_getrusage(syscallno, sizeof(struct bsd43_rusage));
  470. X}
  471. X
  472. Xstatic
  473. Xint
  474. Xsys_gettimeofday(syscallno)
  475. Xint    syscallno;
  476. X{
  477. X    struct bsd43_timeval    tv;
  478. X    struct bsd43_timezone    tz;
  479. X
  480. X    return generic_gettimeofday(syscallno, &tv, sizeof(tv), &tz, sizeof(tz));
  481. X}
  482. X
  483. Xstatic
  484. Xint
  485. Xsys_getuid(syscallno)
  486. Xint    syscallno;
  487. X{
  488. X    /*
  489. X     * TODO: second return value for BSD43 getuid().
  490. X     */
  491. X    Rstart;
  492. X    return_value0 = syscall(syscallno);
  493. X    return_value1 = geteuid();    /* Not really correct. */
  494. X    return_errno = errno;
  495. X    Rstop;
  496. X
  497. X    return 0;
  498. X}
  499. X
  500. Xtypedef union bsd43_ifcu    bsd43_ifcu;
  501. Xunion bsd43_ifcu
  502. X{
  503. X    caddr_t        ifcu_buf;
  504. X    struct ifreq    *ifcu_req;
  505. X};
  506. X
  507. Xtypedef struct bsd43_ifconf    bsd43_ifconf;
  508. Xstruct bsd43_ifconf
  509. X{
  510. X    int        ifc_len;    /* size of associated buffer */
  511. X    bsd43_ifcu    ifc_ifcu;
  512. X};
  513. X
  514. X#define    ifconf    bsd43_ifconf
  515. X
  516. X/*
  517. X * See /bsd43/usr/include/sys/ioctl.h.
  518. X */
  519. Xstatic
  520. Xint
  521. Xsys_ioctl(syscallno)
  522. Xint    syscallno;
  523. X{
  524. X    int        length;
  525. X    int        need_copy_in;
  526. X    int        need_copy_out;
  527. X    char        iocbuf[BSD43_IOCPARM_MASK];
  528. X    bsd43_ifconf    *ifp;
  529. X    caddr_t        saved_ifcu_buf;
  530. X
  531. X    if ((arg[1] & (unsigned long)(BSD43_IOC_INOUT | BSD43_IOC_VOID)) == 0)
  532. X        return sysv_sys_ioctl();
  533. X
  534. X    need_copy_in = arg[1] & (unsigned long)BSD43_IOC_IN;
  535. X    need_copy_out = arg[1] & (unsigned long)BSD43_IOC_OUT;
  536. X    length = (arg[1] >> (unsigned long)16) & (unsigned long)BSD43_IOCPARM_MASK;
  537. X
  538. X    if (need_copy_in)
  539. X    {
  540. X        if (quiet_procmget(GLOBALdipc, (unsigned long)arg[2], &iocbuf[0], length) == -1)
  541. X            return -1;
  542. X    }
  543. X
  544. X    /*
  545. X     * Sadly, the bsd43 ioctl encoding scheme only handles
  546. X     * one level of indirection, so ...
  547. X     */
  548. X    switch (arg[1])
  549. X    {
  550. X    case BSD43_SIOCGIFCONF:
  551. X        /*
  552. X         * if(7)
  553. X         */
  554. X        ifp = (bsd43_ifconf *)&iocbuf[0];
  555. X
  556. X        if (bufset((unsigned int)ifp->ifc_len) == -1)
  557. X            return -1;
  558. X
  559. X        saved_ifcu_buf = ifp->ifc_ifcu.ifcu_buf;
  560. X        ifp->ifc_ifcu.ifcu_buf = sys_call_buf;
  561. X        break;
  562. X    }
  563. X
  564. X    /*
  565. X     * TODO: But what about fd's hidden in ioctl() args?
  566. X     *       strioctl() calls, for example.
  567. X     */
  568. X    Rstart;
  569. X    return_value0 = syscall(syscallno, fd_lookup((int)arg[0]), (int)arg[1], &iocbuf[0]);
  570. X    return_errno = errno;
  571. X    Rstop;
  572. X
  573. X    if (return_value0 != -1 && need_copy_out)
  574. X    {
  575. X        switch (arg[1])
  576. X        {
  577. X        case BSD43_SIOCGIFCONF:
  578. X            ifp = (bsd43_ifconf *)&iocbuf[0];
  579. X
  580. X            if (quiet_procmput(GLOBALdipc, (unsigned long)saved_ifcu_buf, sys_call_buf, ifp->ifc_len) == -1)
  581. X                return -1;
  582. X
  583. X            ifp->ifc_ifcu.ifcu_buf = saved_ifcu_buf;
  584. X            break;
  585. X        }
  586. X
  587. X        if (quiet_procmput(GLOBALdipc, (unsigned long)arg[2], &iocbuf[0], length) == -1)
  588. X            return -1;
  589. X    }
  590. X
  591. X    return 0;
  592. X}
  593. X
  594. X/*
  595. X * Global entry point so that the sysv ioctl()
  596. X * can call the bsd43 ioctl() when it finds that
  597. X * it is really being called with bsd43 arguments
  598. X * .. yes, this is fairly gross.
  599. X */
  600. Xint
  601. Xbsd43_sys_ioctl()
  602. X{
  603. X    static int    ive_been_called_before;
  604. X    int        result;
  605. X
  606. X    if (ive_been_called_before)
  607. X        result = -2;
  608. X    else
  609. X    {
  610. X        ive_been_called_before = 1;
  611. X        result = sys_ioctl(BSD43_SYS_ioctl);
  612. X    }
  613. X
  614. X    ive_been_called_before = 0;
  615. X
  616. X    return result;
  617. X}
  618. X
  619. Xstatic
  620. Xint
  621. Xsys_lstat(syscallno)
  622. Xint    syscallno;
  623. X{
  624. X    struct bsd43_stat    statb;
  625. X
  626. X    return generic_lstat(syscallno, &statb, sizeof(statb));
  627. X}
  628. X
  629. Xstatic
  630. Xint
  631. Xsys_mount(syscallno)
  632. Xint    syscallno;
  633. X{
  634. X    char                *typenamep;
  635. X    char                typename[1024];
  636. X    char                *dirnamep;
  637. X    char                dirname[1024];
  638. X    char                *normal_argsp;
  639. X    char                normal_args[1024];
  640. X    struct bsd43_nfs_args        nfsargs;
  641. X    /*
  642. X     * Should be:
  643. X
  644. X    struct bsd43_sockaddr_in    sock;
  645. X
  646. X     * but there doesn't seem to be such
  647. X     * a definition in any of the include
  648. X     * files I've looked through, so...
  649. X     */
  650. X    struct sockaddr_in        sock;
  651. X    fhandle_t            fh;
  652. X    char                *data;
  653. X    char                shostname[HOSTNAMESZ];
  654. X    char                snetname[MAXNETNAMELEN + 1];
  655. X
  656. X    if (mgets(arg[0], &typenamep) == -1)
  657. X        return -1;
  658. X
  659. X    if (typenamep != (char *)0)
  660. X    {
  661. X        (void)strcpy(&typename[0], typenamep);
  662. X        typenamep = &typename[0];
  663. X    }
  664. X
  665. X    if (mgets(arg[1], &dirnamep) == -1)
  666. X        return -1;
  667. X
  668. X    if (dirnamep != (char *)0)
  669. X    {
  670. X        (void)strcpy(&dirname[0], dirnamep);
  671. X        dirnamep = &dirname[0];
  672. X    }
  673. X
  674. X    if
  675. X    (
  676. X        strcmp(&typename[0], "ffs") == 0
  677. X        ||
  678. X        strcmp(&typename[0], "ufs") == 0
  679. X        ||
  680. X        strcmp(&typename[0], "4.3") == 0
  681. X    )
  682. X    {
  683. X        if (mgets(arg[3], &normal_argsp) == -1)
  684. X            return -1;
  685. X
  686. X        if (normal_argsp != (char *)0)
  687. X        {
  688. X            (void)strcpy(&normal_args[0], normal_argsp);
  689. X            normal_argsp = &normal_args[0];
  690. X        }
  691. X
  692. X        data = normal_argsp;
  693. X    }
  694. X    else    /* "nfs" */
  695. X    {
  696. X        if (quiet_procmget(GLOBALdipc, (unsigned long)arg[3], &nfsargs, sizeof(nfsargs)) == -1)
  697. X            return -1;
  698. X
  699. X        if (quiet_procmget(GLOBALdipc, (unsigned long)nfsargs.addr, &sock, sizeof(sock)) == -1)
  700. X            return -1;
  701. X
  702. X        /*
  703. X         * This cast is wrong but see comment
  704. X         * above at start of this routine.
  705. X         */
  706. X        *(char **)&nfsargs.addr = (char *)&sock;
  707. X
  708. X        if (quiet_procmget(GLOBALdipc, (unsigned long)nfsargs.fh, &fh, sizeof(fh)) == -1)
  709. X            return -1;
  710. X
  711. X        nfsargs.fh = (caddr_t)&fh;
  712. X
  713. X        if (nfsargs.flags & BSD43_NFSMNT_HOSTNAME)
  714. X        {
  715. X            if (quiet_procmget(GLOBALdipc, (unsigned long)nfsargs.bsd43_hostname, &shostname[0], sizeof(shostname)) == -1)
  716. X                return -1;
  717. X
  718. X            nfsargs.bsd43_hostname = &shostname[0];
  719. X        }
  720. X
  721. X        if (nfsargs.flags & BSD43_NFSMNT_SECURE)
  722. X        {
  723. X            if (quiet_procmget(GLOBALdipc, (unsigned long)nfsargs.netname, &snetname[0], sizeof(snetname)) == -1)
  724. X                return -1;
  725. X
  726. X            nfsargs.netname = &snetname[0];
  727. X        }
  728. X
  729. X        data = (char *)&nfsargs;
  730. X    }
  731. X
  732. X    Rstart;
  733. X    return_value0 = syscall(syscallno, typenamep, dirnamep, (int)arg[2], (int)data);
  734. X    return_errno = errno;
  735. X    Rstop;
  736. X
  737. X    return 0;
  738. X}
  739. X
  740. Xstatic
  741. Xint
  742. Xsys_pipe(syscallno)
  743. Xint    syscallno;
  744. X{
  745. X    /*
  746. X     * TODO: do real bsd43 syscall for pipe()
  747. X     */
  748. X    int    fds[2];
  749. X
  750. X    Rstart;
  751. X    return_value0 = pipe(&fds[0]);
  752. X    return_errno = errno;
  753. X    Rstop;
  754. X
  755. X    if (return_value0 != -1)
  756. X    {
  757. X        return_value0 = fd_open(fds[0]);
  758. X        return_value1 = fd_open(fds[1]);
  759. X    }
  760. X
  761. X    return 0;
  762. X}
  763. X
  764. Xstatic
  765. Xint
  766. Xsys_readv(syscallno)
  767. Xint    syscallno;
  768. X{
  769. X    struct bsd43_iovec    *saved_iov;
  770. X    struct bsd43_iovec    *iov;
  771. X    int            iovcnt;
  772. X    int            i;
  773. X
  774. X    iovcnt = arg[2];
  775. X
  776. X    /*
  777. X     * Copy in the scatter/gather array.
  778. X     */
  779. X    if ((struct bsd43_iovec *)arg[1] != (struct bsd43_iovec *)0)
  780. X    {
  781. X        if ((iov = (struct bsd43_iovec *)malloc(iovcnt * sizeof(*iov))) == (struct bsd43_iovec *)0)
  782. X        {
  783. X            vcouldnot("allocate buffer for scatter/gather vector of %d elements", iovcnt);
  784. X            return -1;
  785. X        }
  786. X
  787. X        if (quiet_procmget(GLOBALdipc, (unsigned long)arg[1], iov, (unsigned int)iovcnt * sizeof(*iov)) == -1)
  788. X            return -1;
  789. X
  790. X        /*
  791. X         * Save a copy of the array.
  792. X         */
  793. X        if ((saved_iov = (struct bsd43_iovec *)malloc(iovcnt * sizeof(*iov))) == (struct bsd43_iovec *)0)
  794. X        {
  795. X            vcouldnot("allocate buffer for saved scatter/gather vector of %d elements", iovcnt);
  796. X            return -1;
  797. X        }
  798. X
  799. X        (void)memcpy(saved_iov, iov, iovcnt * sizeof(*iov));
  800. X
  801. X        /*
  802. X         * Copy in each entry of the array.
  803. X         */
  804. X        for (i = 0; i < iovcnt; i++)
  805. X        {
  806. X            struct bsd43_iovec    *liovp;
  807. X
  808. X            liovp = &iov[i];
  809. X
  810. X            if (liovp->iov_base != (caddr_t)0)
  811. X            {
  812. X                caddr_t    b;
  813. X
  814. X                if ((b = (caddr_t)malloc(liovp->iov_len)) == (caddr_t)0)
  815. X                {
  816. X                    vcouldnot("allocate buffer for member of scatter/gather vector of %d bytes", liovp->iov_len);
  817. X                    return -1;
  818. X                }
  819. X
  820. X                if (quiet_procmget(GLOBALdipc, (unsigned long)liovp->iov_base, b, (unsigned int)liovp->iov_len) == -1)
  821. X                    return -1;
  822. X
  823. X                liovp->iov_base = b;
  824. X            }
  825. X        }
  826. X    }
  827. X
  828. X    Rstart;
  829. X    return_value0 = syscall(syscallno, fd_lookup((int)arg[0]), iov, iovcnt);
  830. X    return_errno = errno;
  831. X    Rstop;
  832. X
  833. X    /*
  834. X     * Copy out fields to the user, free()'ing as we go.
  835. X     */
  836. X
  837. X    /*
  838. X     * Copy out the scatter/gather array.
  839. X     */
  840. X    if ((struct bsd43_iovec *)(arg[1]) != (struct bsd43_iovec *)0)
  841. X    {
  842. X        /*
  843. X         * Copy out each entry of the array.
  844. X         */
  845. X        for (i = 0; i < iovcnt; i++)
  846. X        {
  847. X            struct bsd43_iovec    *liovp;
  848. X
  849. X            liovp = &iov[i];
  850. X
  851. X            if (saved_iov[i].iov_base != (caddr_t)0)
  852. X            {
  853. X                if (quiet_procmput(GLOBALdipc, (unsigned long)saved_iov[i].iov_base, liovp->iov_base, (unsigned int)liovp->iov_len) == -1)
  854. X                    return -1;
  855. X
  856. X                (void)free(liovp->iov_base);
  857. X            }
  858. X        }
  859. X
  860. X        (void)free(saved_iov);
  861. X
  862. X        /*
  863. X         * Copy out the reconstructed array itself?
  864. X         */
  865. X
  866. X        (void)free(iov);
  867. X    }
  868. X
  869. X    return 0;
  870. X}
  871. X
  872. Xstatic
  873. Xint
  874. Xsys_recvfrom(syscallno)
  875. Xint    syscallno;
  876. X{
  877. X    struct bsd43_sockaddr    from;
  878. X
  879. X    return generic_recvfrom(syscallno, &from);
  880. X}
  881. X
  882. Xstatic
  883. Xint
  884. Xsys_recvmsg(syscallno)
  885. Xint    syscallno;
  886. X{
  887. X    struct bsd43_msghdr    local_msghdr;
  888. X    struct bsd43_msghdr    saved_local_msghdr;
  889. X    struct bsd43_iovec    *saved_msg_iov;
  890. X
  891. X    if (quiet_procmget(GLOBALdipc, (unsigned long)arg[1], &local_msghdr, sizeof(local_msghdr)) == -1)
  892. X        return -1;
  893. X
  894. X    saved_local_msghdr = local_msghdr;
  895. X
  896. X    /*
  897. X     * Copy in the optional address.
  898. X     */
  899. X    if (local_msghdr.msg_name != (caddr_t)0)
  900. X    {
  901. X        caddr_t    name;
  902. X
  903. X        if ((name = (caddr_t)malloc(local_msghdr.msg_namelen)) == (caddr_t)0)
  904. X        {
  905. X            vcouldnot("allocate buffer for msg_name of length %d bytes", local_msghdr.msg_namelen);
  906. X            return -1;
  907. X        }
  908. X
  909. X        if (quiet_procmget(GLOBALdipc, (unsigned long)local_msghdr.msg_name, name, (unsigned int)local_msghdr.msg_namelen) == -1)
  910. X            return -1;
  911. X
  912. X        local_msghdr.msg_name = name;
  913. X    }
  914. X
  915. X    /*
  916. X     * Copy in the scatter/gather array.
  917. X     */
  918. X    if (local_msghdr.msg_iov != (struct bsd43_iovec *)0)
  919. X    {
  920. X        struct bsd43_iovec    *v;
  921. X        int            i;
  922. X
  923. X        if ((v = (struct bsd43_iovec *)malloc(local_msghdr.msg_iovlen * sizeof(*v))) == (struct bsd43_iovec *)0)
  924. X        {
  925. X            vcouldnot("allocate buffer for scatter/gather vector of %d elements", local_msghdr.msg_iovlen);
  926. X            return -1;
  927. X        }
  928. X
  929. X        if (quiet_procmget(GLOBALdipc, (unsigned long)local_msghdr.msg_iov, v, (unsigned int)local_msghdr.msg_iovlen * sizeof(*v)) == -1)
  930. X            return -1;
  931. X
  932. X        local_msghdr.msg_iov = v;
  933. X
  934. X        /*
  935. X         * Save a copy of the array.
  936. X         */
  937. X        if ((saved_msg_iov = (struct bsd43_iovec *)malloc(local_msghdr.msg_iovlen * sizeof(*v))) == (struct bsd43_iovec *)0)
  938. X        {
  939. X            vcouldnot("allocate buffer for saved scatter/gather vector of %d elements", local_msghdr.msg_iovlen);
  940. X            return -1;
  941. X        }
  942. X
  943. X        (void)memcpy(saved_msg_iov, v, local_msghdr.msg_iovlen * sizeof(*v));
  944. X
  945. X        /*
  946. X         * Copy in each entry of the array.
  947. X         */
  948. X        for (i = 0; i < local_msghdr.msg_iovlen; i++)
  949. X        {
  950. X            struct bsd43_iovec    *liovp;
  951. X
  952. X            liovp = &(local_msghdr.msg_iov[i]);
  953. X
  954. X            if (liovp->iov_base != (caddr_t)0)
  955. X            {
  956. X                caddr_t    b;
  957. X
  958. X                if ((b = (caddr_t)malloc(liovp->iov_len)) == (caddr_t)0)
  959. X                {
  960. X                    vcouldnot("allocate buffer for member of scatter/gather vector of %d bytes", liovp->iov_len);
  961. X                    return -1;
  962. X                }
  963. X
  964. X                if (quiet_procmget(GLOBALdipc, (unsigned long)liovp->iov_base, b, (unsigned int)liovp->iov_len) == -1)
  965. X                    return -1;
  966. X
  967. X                liovp->iov_base = b;
  968. X            }
  969. X        }
  970. X    }
  971. X
  972. X    /*
  973. X     * Copy in the optional(?) access rights.
  974. X     */
  975. X    if (local_msghdr.msg_accrights != (caddr_t)0)
  976. X    {
  977. X        caddr_t    a;
  978. X
  979. X        if ((a = (caddr_t)malloc(local_msghdr.msg_accrightslen)) == (caddr_t)0)
  980. X        {
  981. X            vcouldnot("allocate buffer for access rights of length %d bytes", local_msghdr.msg_accrightslen);
  982. X            return -1;
  983. X        }
  984. X
  985. X        if (quiet_procmget(GLOBALdipc, (unsigned long)local_msghdr.msg_accrights, a, (unsigned int)local_msghdr.msg_accrightslen) == -1)
  986. X            return -1;
  987. X
  988. X        local_msghdr.msg_accrights = a;
  989. X    }
  990. X
  991. X    Rstart;
  992. X    return_value0 = syscall(syscallno, fd_lookup((int)arg[0]), &local_msghdr, (int)arg[2]);
  993. X    return_errno = errno;
  994. X    Rstop;
  995. X
  996. X    /*
  997. X     * Copy out fields to the user, free()'ing as we go.
  998. X     */
  999. X
  1000. X    /*
  1001. X     * Copy out the access rights.
  1002. X     */
  1003. X    if (saved_local_msghdr.msg_accrights != (caddr_t)0)
  1004. X    {
  1005. X        if (quiet_procmput(GLOBALdipc, (unsigned long)saved_local_msghdr.msg_accrights, local_msghdr.msg_accrights, (unsigned int)local_msghdr.msg_accrightslen) == -1)
  1006. X            return -1;
  1007. X
  1008. X        (void)free((char *)local_msghdr.msg_accrights);
  1009. X    }
  1010. X
  1011. X    /*
  1012. X     * Copy out the scatter/gather array.
  1013. X     */
  1014. X    if (saved_local_msghdr.msg_iov != (struct bsd43_iovec *)0)
  1015. X    {
  1016. X        int    i;
  1017. X
  1018. X        /*
  1019. X         * Copy out each entry of the array.
  1020. X         */
  1021. X        for (i = 0; i < local_msghdr.msg_iovlen; i++)
  1022. X        {
  1023. X            struct bsd43_iovec    *liovp;
  1024. X
  1025. X            liovp = &(local_msghdr.msg_iov[i]);
  1026. X
  1027. X            if (saved_msg_iov[i].iov_base != (caddr_t)0)
  1028. X            {
  1029. X                if (quiet_procmput(GLOBALdipc, (unsigned long)saved_msg_iov[i].iov_base, liovp->iov_base, (unsigned int)liovp->iov_len) == -1)
  1030. X                    return -1;
  1031. X                
  1032. X                (void)free(liovp->iov_base);
  1033. X            }
  1034. X        }
  1035. X
  1036. X        (void)free(saved_msg_iov);
  1037. X
  1038. X        /*
  1039. X         * Copy out the reconstructed array itself?
  1040. X         */
  1041. X
  1042. X        (void)free(local_msghdr.msg_iov);
  1043. X    }
  1044. X
  1045. X    /*
  1046. X     * Copy out the received name and its length?
  1047. X     */
  1048. X
  1049. X    (void)free(local_msghdr.msg_name);
  1050. X
  1051. X    return 0;
  1052. X}
  1053. X
  1054. X#define    select_dget(a,d,pp,m,nm)    \
  1055. X{ \
  1056. X    if (a == 0) \
  1057. X        pp = (struct bsd43_fd_set *)0; \
  1058. X    else \
  1059. X    { \
  1060. X        struct bsd43_fd_set    tfds; \
  1061. X        int            fd; \
  1062. X \
  1063. X        if (quiet_procmget(GLOBALdipc, (unsigned long)a, &tfds, howmany(m, NFDBITS) * sizeof(bsd43_fd_mask)) == -1) \
  1064. X            return -1; \
  1065. X \
  1066. X        BSD43_FD_ZERO(&d); \
  1067. X \
  1068. X        for (fd = 0; fd < m; fd++) \
  1069. X        { \
  1070. X            int    nfd; \
  1071. X \
  1072. X            if \
  1073. X            ( \
  1074. X                BSD43_FD_ISSET(fd, &tfds) \
  1075. X                && \
  1076. X                (nfd = fd_lookup(fd)) != -1 \
  1077. X            ) \
  1078. X            { \
  1079. X                BSD43_FD_SET(nfd, &d); \
  1080. X                if (nfd >= nm) \
  1081. X                    nm = nfd + 1; \
  1082. X            } \
  1083. X        } \
  1084. X \
  1085. X        pp = &d; \
  1086. X    } \
  1087. X}
  1088. X
  1089. X#define    select_tget(a,d,p,t)    \
  1090. X{ \
  1091. X    if (a == 0) \
  1092. X        p = (t *)0; \
  1093. X    else \
  1094. X    { \
  1095. X        if (quiet_procmget(GLOBALdipc, (unsigned long)a, &d, sizeof(d)) == -1) \
  1096. X            return -1; \
  1097. X \
  1098. X        p = &d; \
  1099. X    } \
  1100. X}
  1101. X
  1102. X#define    select_dput(a,pp,nn)    \
  1103. X{ \
  1104. X    if (a != 0) \
  1105. X    { \
  1106. X        struct bsd43_fd_set    tfds; \
  1107. X        int            fd; \
  1108. X \
  1109. X        BSD43_FD_ZERO(&tfds); \
  1110. X \
  1111. X        for (fd = 0; fd < nn; fd++) \
  1112. X        { \
  1113. X            int    nfd; \
  1114. X \
  1115. X            if \
  1116. X            ( \
  1117. X                (nfd = fd_lookup(fd)) != -1 \
  1118. X                && \
  1119. X                BSD43_FD_ISSET(nfd, pp) \
  1120. X            ) \
  1121. X                BSD43_FD_SET(fd, &tfds); \
  1122. X        } \
  1123. X \
  1124. X        if (quiet_procmput(GLOBALdipc, (unsigned long)a, &tfds, howmany(nn, BSD43_NFDBITS) * sizeof(bsd43_fd_mask)) == -1) \
  1125. X            return -1; \
  1126. X    } \
  1127. X}
  1128. X
  1129. Xstatic
  1130. Xint
  1131. Xsys_select(syscallno)
  1132. Xint    syscallno;
  1133. X{
  1134. X    struct bsd43_fd_set    rfds;
  1135. X    struct bsd43_fd_set    *rfdsp;
  1136. X    struct bsd43_fd_set    wfds;
  1137. X    struct bsd43_fd_set    *wfdsp;
  1138. X    struct bsd43_fd_set    efds;
  1139. X    struct bsd43_fd_set    *efdsp;
  1140. X    struct bsd43_timeval    timeout;
  1141. X    struct bsd43_timeval    *timeoutp;
  1142. X    int            nfds;
  1143. X    int            newnfds;
  1144. X
  1145. X    nfds = (int)arg[0];
  1146. X    if (nfds > fd_nfiles())
  1147. X        nfds = fd_nfiles();
  1148. X    newnfds = 0;
  1149. X
  1150. X    select_dget(arg[1], rfds, rfdsp, nfds, newnfds);
  1151. X    select_dget(arg[2], wfds, wfdsp, nfds, newnfds);
  1152. X    select_dget(arg[3], efds, efdsp, nfds, newnfds);
  1153. X    select_tget(arg[4], timeout, timeoutp, struct bsd43_timeval);
  1154. X
  1155. X    Rstart;
  1156. X    return_value0 = syscall(syscallno, newnfds, rfdsp, wfdsp, efdsp, timeoutp);
  1157. X    return_errno = errno;
  1158. X    Rstop;
  1159. X
  1160. X    if (return_value0 != -1)
  1161. X    {
  1162. X        select_dput(arg[3], efdsp, nfds);
  1163. X        select_dput(arg[2], wfdsp, nfds);
  1164. X        select_dput(arg[1], rfdsp, nfds);
  1165. X    }
  1166. X
  1167. X    return 0;
  1168. X}
  1169. X
  1170. Xstatic
  1171. Xint
  1172. Xsys_sendmsg(syscallno)
  1173. Xint    syscallno;
  1174. X{
  1175. X    struct bsd43_msghdr    local_msghdr;
  1176. X
  1177. X    if (quiet_procmget(GLOBALdipc, (unsigned long)arg[1], &local_msghdr, sizeof(local_msghdr)) == -1)
  1178. X        return -1;
  1179. X
  1180. X#if    0
  1181. Xfprintf(outfp, "local_msghdr.msg_name = 0x%x\n", local_msghdr.msg_name);
  1182. Xfprintf(outfp, "local_msghdr.msg_namelen = %d\n", local_msghdr.msg_namelen);
  1183. X#endif    /* 0 */
  1184. X
  1185. X    /*
  1186. X     * Copy in the optional address.
  1187. X     */
  1188. X    if (local_msghdr.msg_name != (caddr_t)0)
  1189. X    {
  1190. X        caddr_t    name;
  1191. X
  1192. X        if ((name = (caddr_t)malloc(local_msghdr.msg_namelen)) == (caddr_t)0)
  1193. X        {
  1194. X            vcouldnot("allocate buffer for msg_name of length %d bytes", local_msghdr.msg_namelen);
  1195. X            return -1;
  1196. X        }
  1197. X
  1198. X        if (quiet_procmget(GLOBALdipc, (unsigned long)local_msghdr.msg_name, name, (unsigned int)local_msghdr.msg_namelen) == -1)
  1199. X            return -1;
  1200. X
  1201. X        local_msghdr.msg_name = name;
  1202. X
  1203. X#if    0
  1204. X{
  1205. X    int    i;
  1206. X
  1207. X    fprintf(outfp, "msg_name =");
  1208. X    for (i = 0; i < local_msghdr.msg_namelen; i++)
  1209. X        fprintf(outfp, "%02x", local_msghdr.msg_name[i] & 0xFF);
  1210. X    fprintf(outfp, "\n");
  1211. X}
  1212. X#endif    /* 0 */
  1213. X    }
  1214. X
  1215. X#if    0
  1216. Xfprintf(outfp, "local_msghdr.msg_iov = 0x%x\n", local_msghdr.msg_iov);
  1217. Xfprintf(outfp, "local_msghdr.msg_iovlen = %d\n", local_msghdr.msg_iovlen);
  1218. X#endif    /* 0 */
  1219. X
  1220. X    /*
  1221. X     * Copy in the scatter/gather array.
  1222. X     */
  1223. X    if (local_msghdr.msg_iov != (struct bsd43_iovec *)0)
  1224. X    {
  1225. X        struct bsd43_iovec    *v;
  1226. X        int            i;
  1227. X
  1228. X        if ((v = (struct bsd43_iovec *)malloc(local_msghdr.msg_iovlen * sizeof(*v))) == (struct bsd43_iovec *)0)
  1229. X        {
  1230. X            vcouldnot("allocate buffer for scatter/gather vector of %d elements", local_msghdr.msg_iovlen);
  1231. X            return -1;
  1232. X        }
  1233. X
  1234. X        if (quiet_procmget(GLOBALdipc, (unsigned long)local_msghdr.msg_iov, v, (unsigned int)local_msghdr.msg_iovlen * sizeof(*v)) == -1)
  1235. X            return -1;
  1236. X
  1237. X        local_msghdr.msg_iov = v;
  1238. X
  1239. X        /*
  1240. X         * Copy in each entry in the array.
  1241. X         */
  1242. X        for (i = 0; i < local_msghdr.msg_iovlen; i++)
  1243. X        {
  1244. X            struct bsd43_iovec    *liovp;
  1245. X
  1246. X            liovp = &(local_msghdr.msg_iov[i]);
  1247. X
  1248. X#if    0
  1249. Xfprintf(outfp, "local_msghdr.msg_iov[%d].iov_base = 0x%x\n", i, liovp->iov_base);
  1250. Xfprintf(outfp, "local_msghdr.msg_iov[%d].iov_len = %d\n", i, liovp->iov_len);
  1251. X#endif    /* 0 */
  1252. X
  1253. X            if (liovp->iov_base != (caddr_t)0)
  1254. X            {
  1255. X                caddr_t    b;
  1256. X
  1257. X                if ((b = (caddr_t)malloc(liovp->iov_len)) == (caddr_t)0)
  1258. X                {
  1259. X                    vcouldnot("allocate buffer for member of scatter/gather vector of %d bytes", liovp->iov_len);
  1260. X                    return -1;
  1261. X                }
  1262. X
  1263. X                if (quiet_procmget(GLOBALdipc, (unsigned long)liovp->iov_base, b, (unsigned int)liovp->iov_len) == -1)
  1264. X                    return -1;
  1265. X
  1266. X                liovp->iov_base = b;
  1267. X            }
  1268. X        }
  1269. X    }
  1270. X
  1271. X#if    0
  1272. Xfprintf(outfp, "local_msghdr.msg_accrights = %d\n", local_msghdr.msg_accrights);
  1273. Xfprintf(outfp, "local_msghdr.msg_accrightslen = %d\n", local_msghdr.msg_accrightslen);
  1274. X#endif    /* 0 */
  1275. X
  1276. X    /*
  1277. X     * Copy in the optional(?) access rights.
  1278. X     */
  1279. X    if (local_msghdr.msg_accrights != (caddr_t)0)
  1280. X    {
  1281. X        caddr_t    a;
  1282. X
  1283. X        if ((a = (caddr_t)malloc(local_msghdr.msg_accrightslen)) == (caddr_t)0)
  1284. X        {
  1285. X            vcouldnot("allocate buffer for access rights of length %d bytes", local_msghdr.msg_accrightslen);
  1286. X            return -1;
  1287. X        }
  1288. X
  1289. X        if (quiet_procmget(GLOBALdipc, (unsigned long)local_msghdr.msg_accrights, a, (unsigned int)local_msghdr.msg_accrightslen) == -1)
  1290. X            return -1;
  1291. X
  1292. X        local_msghdr.msg_accrights = a;
  1293. X    }
  1294. X
  1295. X    Rstart;
  1296. X    return_value0 = syscall(syscallno, fd_lookup((int)arg[0]), &local_msghdr, (int)arg[2]);
  1297. X    return_errno = errno;
  1298. X    Rstop;
  1299. X
  1300. X    /*
  1301. X     * Should we copy out any of these fields to the user?
  1302. X     * Assuming "no" until demonstrated otherwise.
  1303. X     */
  1304. X
  1305. X    /*
  1306. X     * Free up all the temporary space...
  1307. X     */
  1308. X
  1309. X    if (local_msghdr.msg_accrights != (caddr_t)0)
  1310. X        (void)free((char *)local_msghdr.msg_accrights);
  1311. X
  1312. X    if (local_msghdr.msg_iov != (struct bsd43_iovec *)0)
  1313. X    {
  1314. X        int    i;
  1315. X
  1316. X        for (i = 0; i < local_msghdr.msg_iovlen; i++)
  1317. X        {
  1318. X            struct bsd43_iovec    *liovp;
  1319. X
  1320. X            liovp = &local_msghdr.msg_iov[i];
  1321. X
  1322. X            if (liovp->iov_base != (caddr_t)0)
  1323. X                (void)free((char *)liovp->iov_base);
  1324. X        }
  1325. X
  1326. X        (void)free((char *)local_msghdr.msg_iov);
  1327. X    }
  1328. X
  1329. X    if (local_msghdr.msg_name != (caddr_t)0)
  1330. X        (void)free((char *)local_msghdr.msg_name);
  1331. X
  1332. X    return 0;
  1333. X}
  1334. X
  1335. Xstatic
  1336. Xint
  1337. Xsys_sendto(syscallno)
  1338. Xint    syscallno;
  1339. X{
  1340. X    struct bsd43_sockaddr    to;
  1341. X
  1342. X    return generic_sendto(syscallno, &to);
  1343. X}
  1344. X
  1345. Xstatic
  1346. Xint
  1347. Xsys_setitimer(syscallno)
  1348. Xint    syscallno;
  1349. X{
  1350. X    struct bsd43_itimerval    it;
  1351. X    struct bsd43_itimerval    oit;
  1352. X
  1353. X    return generic_setitimer(syscallno, &it, sizeof(it), &oit, sizeof(oit));
  1354. X}
  1355. X
  1356. Xstatic
  1357. Xint
  1358. Xsys_setpgrp(syscallno)
  1359. Xint    syscallno;
  1360. X{
  1361. X    Rstart;
  1362. X    return_value0 = syscall(syscallno, (int)arg[0], (int)arg[1]);
  1363. X    return_errno = errno;
  1364. X    Rstop;
  1365. X
  1366. X    return 0;
  1367. X}
  1368. X
  1369. Xstatic
  1370. Xint
  1371. Xsys_setrlimit(syscallno)
  1372. Xint    syscallno;
  1373. X{
  1374. X    return generic_setrlimit(syscallno, sizeof(struct bsd43_rlimit));
  1375. X}
  1376. X
  1377. Xstatic
  1378. Xint
  1379. Xsys_settimeofday(syscallno)
  1380. Xint    syscallno;
  1381. X{
  1382. X    struct bsd43_timeval    tv;
  1383. X    struct bsd43_timezone    tz;
  1384. X
  1385. X    return generic_settimeofday(syscallno, &tv, sizeof(tv), &tz, sizeof(tz));
  1386. X}
  1387. X
  1388. Xstatic
  1389. Xint
  1390. Xsys_sigblock(syscallno)
  1391. Xint    syscallno;
  1392. X{
  1393. X    /*
  1394. X     * TODO - sys_sigblock().
  1395. X     */
  1396. X    Rstart;
  1397. X    return_value0 = syscall(syscallno, (int)arg[0]);
  1398. X    return_errno = errno;
  1399. X    Rstop;
  1400. X
  1401. X    return 0;
  1402. X}
  1403. X
  1404. Xstatic
  1405. Xint
  1406. Xsys_sigpause(syscallno)
  1407. Xint    syscallno;
  1408. X{
  1409. X    /*
  1410. X     * TODO - sys_sigpause().
  1411. X     */
  1412. X    Rstart;
  1413. X    return_value0 = syscall(syscallno, (int)arg[0]);
  1414. X    return_errno = errno;
  1415. X    Rstop;
  1416. X
  1417. X    return 0;
  1418. X}
  1419. X
  1420. Xstatic
  1421. Xint
  1422. Xsys_sigreturn(syscallno)
  1423. Xint    syscallno;
  1424. X{
  1425. X    /*
  1426. X     * TODO - sys_sigreturn().
  1427. X     */
  1428. X    return_value0 = -1;
  1429. X    return_errno = EFAULT;
  1430. X
  1431. X    return 0;
  1432. X}
  1433. X
  1434. Xstatic
  1435. Xint
  1436. Xsys_sigsetmask(syscallno)
  1437. Xint    syscallno;
  1438. X{
  1439. X    /*
  1440. X     * TODO - sys_sigsetmask().
  1441. X     */
  1442. X    Rstart;
  1443. X    return_value0 = syscall(syscallno, (int)arg[0]);
  1444. X    return_errno = errno;
  1445. X    Rstop;
  1446. X
  1447. X    return 0;
  1448. X}
  1449. X
  1450. Xstatic
  1451. Xint
  1452. Xsys_sigstack(syscallno)
  1453. Xint    syscallno;
  1454. X{
  1455. X    /*
  1456. X     * TODO - sys_sigstack().
  1457. X     */
  1458. X    return_value0 = 0;
  1459. X    return_errno = errno;
  1460. X
  1461. X    return 0;
  1462. X}
  1463. X
  1464. Xstatic
  1465. Xint
  1466. Xsys_sigvec(syscallno)
  1467. Xint    syscallno;
  1468. X{
  1469. X    struct bsd43_sigvec    sv;
  1470. X    struct bsd43_sigvec    *svp;
  1471. X    struct bsd43_sigvec    osv;
  1472. X    struct bsd43_sigvec    *osvp;
  1473. X
  1474. X    if (mget(arg[1], &sv, sizeof(sv), &svp) == -1)
  1475. X        return -1;
  1476. X
  1477. X    if (mget(arg[2], &osv, sizeof(osv), &osvp) == -1)
  1478. X        return -1;
  1479. X
  1480. X    if
  1481. X    (
  1482. X        svp == (struct bsd43_sigvec *)0
  1483. X        ||
  1484. X        sv.sv_handler == BSD43_SIG_DFL
  1485. X        ||
  1486. X        sv.sv_handler == BSD43_SIG_IGN
  1487. X    )
  1488. X    {
  1489. X        Rstart;
  1490. X        return_value0 = syscall(syscallno, arg[0], svp, osvp);
  1491. X        return_errno = errno;
  1492. X        Rstop;
  1493. X    }
  1494. X    else
  1495. X    {
  1496. X        /*
  1497. X         * TODO - rest of sys_sigvec().
  1498. X         */
  1499. X        return_value0 = 0;
  1500. X        return_errno = errno;
  1501. X    }
  1502. X
  1503. X    if (mput(arg[2], osvp, sizeof(osv), return_value0) == -1)
  1504. X        return -1;
  1505. X
  1506. X    if (mput(arg[1], svp, sizeof(sv), return_value0) == -1)
  1507. X        return -1;
  1508. X
  1509. X    return 0;
  1510. X}
  1511. X
  1512. Xstatic
  1513. Xint
  1514. Xsys_stat(syscallno)
  1515. Xint    syscallno;
  1516. X{
  1517. X    struct bsd43_stat    statb;
  1518. X
  1519. X    return generic_stat(syscallno, &statb, sizeof(statb));
  1520. X}
  1521. X
  1522. Xstatic
  1523. Xint
  1524. Xsys_statfs(syscallno)
  1525. Xint    syscallno;
  1526. X{
  1527. X    char            *cp;
  1528. X    struct bsd43_statfs    buf;
  1529. X    struct bsd43_statfs    *bufp;
  1530. X
  1531. X    if (mgets(arg[0], &cp) == -1)
  1532. X        return -1;
  1533. X
  1534. X    if (mget(arg[1], &buf, sizeof(buf), &bufp) == -1)
  1535. X        return -1;
  1536. X
  1537. X    Rstart;
  1538. X    return_value0 = syscall(syscallno, cp, bufp);
  1539. X    return_errno = errno;
  1540. X    Rstop;
  1541. X
  1542. X    if (mput(arg[1], bufp, sizeof(buf), return_value0) == -1)
  1543. X        return -1;
  1544. X
  1545. X    return 0;
  1546. X}
  1547. X
  1548. Xstatic
  1549. Xint
  1550. Xsys_sysmips(syscallno)
  1551. Xint    syscallno;
  1552. X{
  1553. X    struct bsd43_hw_config    *hwcp;
  1554. X    struct bsd43_rusage    *rusep;
  1555. X    union bsd43_wait    status;
  1556. X    union bsd43_wait    *statusp;
  1557. X
  1558. X    switch (arg[0])
  1559. X    {
  1560. X    case BSD43_MIPS_HWCONF:
  1561. X        if (dmget(arg[2], sizeof(*hwcp), &hwcp) == -1)
  1562. X            return -1;
  1563. X
  1564. X        Rstart;
  1565. X        return_value0 = syscall(syscallno, arg[0], arg[1], hwcp, arg[3]);
  1566. X        return_errno = errno;
  1567. X        Rstop;
  1568. X
  1569. X        if (dmput(arg[2], hwcp, sizeof(*hwcp), return_value0) == -1)
  1570. X            return -1;
  1571. X
  1572. X        break;
  1573. X
  1574. X    case BSD43_MIPS_GETRUSAGE:
  1575. X        if (dmget(arg[2], arg[3], &rusep) == -1)
  1576. X            return -1;
  1577. X
  1578. X        Rstart;
  1579. X        return_value0 = syscall(syscallno, arg[0], arg[1], rusep, arg[3]);
  1580. X        return_errno = errno;
  1581. X        Rstop;
  1582. X
  1583. X        if (dmput(arg[2], rusep, arg[3], return_value0) == -1)
  1584. X            return -1;
  1585. X
  1586. X        break;
  1587. X
  1588. X    case BSD43_MIPS_WAIT3:
  1589. X        if (mget(arg[1], &status, sizeof(status), &statusp) == -1)
  1590. X            return -1;
  1591. X
  1592. X        if (dmget(arg[3], arg[4], &rusep) == -1)
  1593. X            return -1;
  1594. X
  1595. X        Rstart;
  1596. X        return_value0 = syscall(syscallno, arg[0], statusp, arg[2], rusep, arg[4]);
  1597. X        return_errno = errno;
  1598. X        Rstop;
  1599. X
  1600. X        if (dmput(arg[3], rusep, arg[4], return_value0) == -1)
  1601. X            return -1;
  1602. X
  1603. X        if (mput(arg[1], statusp, sizeof(status), return_value0) == -1)
  1604. X            return -1;
  1605. X
  1606. X        break;
  1607. X
  1608. X    default:
  1609. X        return -2;
  1610. X    }
  1611. X
  1612. X    return 0;
  1613. X}
  1614. X
  1615. Xstatic
  1616. Xint
  1617. Xsys_utimes(syscallno)
  1618. Xint    syscallno;
  1619. X{
  1620. X    struct bsd43_timeval    tv[2];
  1621. X
  1622. X    return generic_utimes(syscallno, &tv[0], sizeof(tv));
  1623. X}
  1624. X
  1625. Xstatic
  1626. Xint
  1627. Xsys_vfork(syscallno)
  1628. Xint    syscallno;
  1629. X{
  1630. X    int    parent_pid;
  1631. X
  1632. X    parent_pid = getpid();
  1633. X
  1634. X    /*
  1635. X     * Not right for vfork() but close
  1636. X     * enough for now.
  1637. X     * Can't be a real vfork() here
  1638. X     * because the child must be allowed to
  1639. X     * return from this routine (aka stack frame).
  1640. X     * So this will break programs
  1641. X     * that rely on (e.g.) the shared memory
  1642. X     * properties of vfork()...
  1643. X     *
  1644. X     * TODO -- proper vfork().
  1645. X     */
  1646. X    errno = 0;
  1647. X    Rstart;
  1648. X    return_value0 = syscall(BSD43_SYS_fork);
  1649. X    return_errno = errno;
  1650. X    Rstop;
  1651. X
  1652. X    if ((P.p_pid = getpid()) != parent_pid)
  1653. X        return_value0 = 0;
  1654. X
  1655. X    switch (return_value0)
  1656. X    {
  1657. X    case -1:    /* error */
  1658. X        break;
  1659. X
  1660. X    case 0:        /* child */
  1661. X        return_value1 = 1;
  1662. X        break;
  1663. X
  1664. X    default:    /* parent */
  1665. X        return_value1 = 0;
  1666. X        break;
  1667. X    }
  1668. X
  1669. X    return 0;
  1670. X}
  1671. X
  1672. Xstatic
  1673. Xint
  1674. Xsys_writev(syscallno)
  1675. Xint    syscallno;
  1676. X{
  1677. X    struct bsd43_iovec    *iov;
  1678. X    int            iovcnt;
  1679. X    int            i;
  1680. X
  1681. X    /*
  1682. X     * Copy in the scatter/gather array.
  1683. X     */
  1684. X    if ((struct bsd43_iovec *)arg[1] == (struct bsd43_iovec *)0)
  1685. X        iov = (struct bsd43_iovec *)0;
  1686. X    else
  1687. X    {
  1688. X        iovcnt = arg[2];
  1689. X
  1690. X        if ((iov = (struct bsd43_iovec *)malloc(iovcnt * sizeof(*iov))) == (struct bsd43_iovec *)0)
  1691. X        {
  1692. X            vcouldnot("allocate buffer for scatter/gather vector of %d elements", iovcnt);
  1693. X            return -1;
  1694. X        }
  1695. X
  1696. X        if (quiet_procmget(GLOBALdipc, (unsigned long)arg[1], iov, (unsigned int)iovcnt * sizeof(*iov)) == -1)
  1697. X            return -1;
  1698. X
  1699. X        /*
  1700. X         * Copy in each entry in the array.
  1701. X         */
  1702. X        for (i = 0; i < iovcnt; i++)
  1703. X        {
  1704. X            struct bsd43_iovec    *liovp;
  1705. X
  1706. X            liovp = &iov[i];
  1707. X
  1708. X            if (liovp->iov_base != (caddr_t)0)
  1709. X            {
  1710. X                caddr_t    b;
  1711. X
  1712. X                if ((b = (caddr_t)malloc(liovp->iov_len)) == (caddr_t)0)
  1713. X                {
  1714. X                    vcouldnot("allocate buffer for member of scatter/gather vector of %d bytes", liovp->iov_len);
  1715. X                    return -1;
  1716. X                }
  1717. X
  1718. X                if (quiet_procmget(GLOBALdipc, (unsigned long)liovp->iov_base, b, (unsigned int)liovp->iov_len) == -1)
  1719. X                    return -1;
  1720. X
  1721. X                liovp->iov_base = b;
  1722. X            }
  1723. X        }
  1724. X    }
  1725. X
  1726. X    Rstart;
  1727. X    return_value0 = syscall(syscallno, fd_lookup((int)arg[0]), iov, iovcnt);
  1728. X    return_errno = errno;
  1729. X    Rstop;
  1730. X
  1731. X    /*
  1732. X     * Should we copy out any of these fields to the user?
  1733. X     * Assuming "no" until demonstrated otherwise.
  1734. X     */
  1735. X
  1736. X    /*
  1737. X     * Free up all the temporary space...
  1738. X     */
  1739. X
  1740. X    if (iov != (struct bsd43_iovec *)0)
  1741. X    {
  1742. X        for (i = 0; i < iovcnt; i++)
  1743. X        {
  1744. X            struct bsd43_iovec    *liovp;
  1745. X
  1746. X            liovp = &iov[i];
  1747. X
  1748. X            if (liovp->iov_base != (caddr_t)0)
  1749. X                (void)free((char *)liovp->iov_base);
  1750. X        }
  1751. X
  1752. X        (void)free((char *)iov);
  1753. X    }
  1754. X
  1755. X    return 0;
  1756. X}
  1757. X
  1758. Xstatic
  1759. Xint
  1760. Xsys_wait3(syscallno)
  1761. Xint    syscallno;
  1762. X{
  1763. X    union bsd43_wait    s;
  1764. X    struct bsd43_rusage    r;
  1765. X
  1766. X    return generic_wait3(syscallno, &s, sizeof(s), &r, sizeof(r));
  1767. X}
  1768. X
  1769. Xstatic sysentry    bsd43_systab[]    =
  1770. X{
  1771. X    { "syscall",    0,    "d",    'd',    (int (*)())0,    },
  1772. X    { "_exit",    1,    "d",    'e',    generic_exit,    },
  1773. X    { "fork",    0,    "",    'Y',    generic_fork,    },
  1774. X    { "read",    3,    "dRd",    'd',    generic_read,    },
  1775. X    { "write",    3,    "dWd",    'd',    generic_write,    },
  1776. X    { "open",    3,    "FOm",    'd',    generic_open,    },
  1777. X    { "close",    1,    "d",    'd',    generic_close,    },
  1778. X    { "Owait",    0,    "",    '\0',    (int (*)())0,    },
  1779. X    { "creat",    2,    "Fm",    'd',    generic_creat,     },
  1780. X    { "link",    2,    "FF",    'd',    generic_link,    },
  1781. X
  1782. X    { "unlink",    1,    "F",    'd',    generic_unlink,    },
  1783. X    { "Oexecv",    0,    "",    '\0',    (int (*)())0,    },
  1784. X    { "chdir",    1,    "F",    'd',    generic_chdir,    },
  1785. X    { "Otime",    0,    "",    '\0',    (int (*)())0,    },
  1786. X    { "mknod",    3,    "Fmx",    'd',    generic_mknod,    },
  1787. X    { "chmod",    2,    "Fm",    'd',    generic_chmod,    },
  1788. X    { "chown",    3,    "Fdd",    'd',    generic_chown,    },
  1789. X    { "brk",    1,    "I",    'd',    generic_brk,    },
  1790. X    { "Ostat",    0,    "",    '\0',    (int (*)())0,    },
  1791. X    { "lseek",    3,    "duw",    'u',    generic_lseek,     },
  1792. X
  1793. X    { "getpid",    0,    "",    'd',    generic_getpid,    },
  1794. X    { "Omount",    0,    "",    '\0',    (int (*)())0,    },
  1795. X    { "Oumount",    0,    "",    '\0',    (int (*)())0,    },
  1796. X    { "Osetuid",    0,    "",    '\0',    (int (*)())0,    },
  1797. X    { "getuid",    0,    "",    'Y',    sys_getuid,    },
  1798. X    { "Ostime",    0,    "",    '\0',    (int (*)())0,    },
  1799. X    { "ptrace",    4,    "ddxd",    'd',    generic_ptrace,    },
  1800. X    { "Oalarm",    0,    "",    '\0',    (int (*)())0,    },
  1801. X    { "Ofstat",    0,    "",    '\0',    (int (*)())0,    },
  1802. X    { "Opause",    0,    "",    '\0',    (int (*)())0,    },
  1803. X
  1804. X    { "Outime",    0,    "",    '\0',    (int (*)())0,    },
  1805. X    { "Ostty",    0,    "",    '\0',    (int (*)())0,    },
  1806. X    { "Ogtty",    0,    "",    '\0',    (int (*)())0,    },
  1807. X    { "access",    2,    "FP",    'd',    generic_access,    },
  1808. X    { "Onice",    0,    "",    '\0',    (int (*)())0,    },
  1809. X    { "Oftime",    0,    "",    '\0',    (int (*)())0,    },
  1810. X    { "sync",    0,    "",    'd',    generic_sync,    },
  1811. X    { "kill",    2,    "dK",    'd',    generic_kill,    },
  1812. X    { "stat",    2,    "FS",    'd',    sys_stat,    },
  1813. X    { "Osetpgrp",    0,    "",    '\0',    (int (*)())0,    },
  1814. X
  1815. X    { "lstat",    2,    "FS",    'd',    sys_lstat,    },
  1816. X    { "dup",    1,    "d",    'd',    generic_dup,    },
  1817. X    { "pipe",    0,    "",    'Y',    sys_pipe,    },
  1818. X    { "Otimes",    0,    "",    '\0',    (int (*)())0,    },
  1819. X    { "profil",    4,    "Iddd",    'd',    generic_profil,    },
  1820. X    { "",        0,    "",    '\0',    (int (*)())0,    },
  1821. X    { "Osetgid",    0,    "",    '\0',    (int (*)())0,    },
  1822. X    { "getgid",    0,    "",    'Y',    sys_getgid,    },
  1823. X    { "Osigsys",    0,    "",    '\0',    (int (*)())0,    },
  1824. X    { "",        0,    "",    '\0',    (int (*)())0,    },
  1825. X
  1826. X    { "",        0,    "",    '\0',    (int (*)())0,    },
  1827. X    { "acct",    1,    "F",    'd',    generic_acct,    },
  1828. X    { "Ophys",    0,    "",    '\0',    (int (*)())0,    },
  1829. X    { "Osyslock",    0,    "",    '\0',    (int (*)())0,    },
  1830. X    { "ioctl",    3,    "dCA",    'd',    sys_ioctl,    },
  1831. X    { "reboot",    0,    "",    '\0',    (int (*)())0,    },
  1832. X    { "Ompxchan",    0,    "",    '\0',    (int (*)())0,    },
  1833. X    { "symlink",    2,    "FF",    'd',    generic_symlink,    },
  1834. X    { "readlink",    3,    "FRd",    'd',    generic_readlink,    },
  1835. X    { "execve",    3,    "FlE",    'e',    sys_execve,    },
  1836. X
  1837. X    { "umask",    1,    "x",    'x',    generic_umask,    },
  1838. X    { "chroot",    1,    "F",    'd',    generic_chroot,    },
  1839. X    { "fstat",    2,    "dS",    'd',    sys_fstat,    },
  1840. X    { "",        0,    "",    '\0',    (int (*)())0,    },
  1841. X    { "getpagesize", 0,    "",    'd',    generic_getpagesize, },
  1842. X    { "mremap",    0,    "",    '\0',    (int (*)())0,    },
  1843. X    { "vfork",    0,    "",    'Y',    sys_vfork,    },
  1844. X    { "Ovread",    0,    "",    '\0',    (int (*)())0,    },
  1845. X    { "Ovwrite",    0,    "",    '\0',    (int (*)())0,    },
  1846. X    { "sbrk",    0,    "",    '\0',    (int (*)())0,    },
  1847. X
  1848. X    { "sstk",    0,    "",    '\0',    (int (*)())0,    },
  1849. X    { "mmap",    0,    "",    '\0',    (int (*)())0,    },
  1850. X    { "Ovadvise",    0,    "",    '\0',    (int (*)())0,    },
  1851. X    { "munmap",    0,    "",    '\0',    (int (*)())0,    },
  1852. X    { "mprotec",    0,    "",    '\0',    (int (*)())0,    },
  1853. X    { "madvise",    0,    "",    '\0',    (int (*)())0,    },
  1854. X    { "vhangup",    0,    "",    'd',    generic_vhangup,    },
  1855. X    { "Ovlimit",    0,    "",    '\0',    (int (*)())0,    },
  1856. X    { "mincore",    0,    "",    '\0',    (int (*)())0,    },
  1857. X    { "getgroups",    2,    "dG",    'd',    sys_getgroups,    },
  1858. X
  1859. X    { "setgroups",    2,    "dg",    'd',    generic_setgroups,    },
  1860. X    { "getpgrp",    1,    "d",    'd',    sys_getpgrp,    },
  1861. X    { "setpgrp",    2,    "dd",    'd',    sys_setpgrp,    },
  1862. X    { "setitimer",    3,    "dVV",    'd',    sys_setitimer,    },
  1863. X    { "wait3",    3,    "xxx",    'd',    sys_wait3,    },
  1864. X    { "swapon",    0,    "",    '\0',    (int (*)())0,    },
  1865. X    { "getitimer",    2,    "dV",    'd',    sys_getitimer,    },
  1866. X    { "gethostname", 2,    "xd",    'd',    generic_gethostname, },
  1867. X    { "sethostname", 0,    "",    '\0',    (int (*)())0,    },
  1868. X    { "getdtablesize", 0,    "",    'd',    generic_getdtablesize, },
  1869. X
  1870. X    { "dup2",    2,    "dd",    'd',    sys_dup2,    },
  1871. X    { "getdopt",    0,    "",    '\0',    (int (*)())0,    },
  1872. X    { "fcntl",    3,    "dBH",    'd',    sys_fcntl,    },
  1873. X    { "select",    5,    "dDDDT", 'd',    sys_select,    },
  1874. X    { "setdopt",    0,    "",    '\0',    (int (*)())0,    },
  1875. X    { "fsync",    1,    "d",    'd',    generic_fsync,    },
  1876. X    { "setpriority", 3,    "ddd",    'd',    generic_setpriority, },
  1877. X    { "socket",    3,    "abc",    'd',    generic_socket,    },
  1878. X    { "connect",    3,    "dLd",    'd',    generic_connect,    },
  1879. X    { "accept",    3,    "dLU",    'd',    generic_accept,    },
  1880. X
  1881. X    { "getpriority", 2,    "dd",    'd',    generic_getpriority, },
  1882. X    { "send",    4,    "dWdN",    'd',    generic_send,    },
  1883. X    { "recv",    4,    "dRdN",    'd',    generic_recv,    },
  1884. X    { "sigreturn",    1,    "I",    'd',    sys_sigreturn,    },
  1885. X    { "bind",    3,    "dLd",    'd',    generic_bind,    },
  1886. X    { "setsockopt", 5,    "dddpd", 'd',    generic_setsockopt, },
  1887. X    { "listen",    2,    "dd",    'd',    generic_listen,    },
  1888. X    { "Ovtimes",    0,    "",    '\0',    (int (*)())0,    },
  1889. X    { "sigvec",    3,    "Kff",    'd',    sys_sigvec,    },
  1890. X    { "sigblock",    1,    "M",    'M',    sys_sigblock,    },
  1891. X
  1892. X    { "sigsetmask", 1,    "M",    'M',    sys_sigsetmask, },
  1893. X    { "sigpause",    1,    "K",    'd',    sys_sigpause,    },
  1894. X    { "sigstack",    2,    "II",    'd',    sys_sigstack,    },
  1895. X    { "recvmsg",    3,    "dpN",    'd',    sys_recvmsg,    },
  1896. X    { "sendmsg",    3,    "dpN",    'd',    sys_sendmsg,    },
  1897. X    { "Ovtrace",    0,    "",    '\0',    (int (*)())0,    },
  1898. X    { "gettimeofday", 2,    "TZ",    'd',    sys_gettimeofday, },
  1899. X    { "getrusage",    2,    "dx",    'd',    sys_getrusage,    },
  1900. X    { "getsockopt", 5,    "dddxU", 'd',    generic_getsockopt,    },
  1901. X    { "Oresuba",    0,    "",    '\0',    (int (*)())0,    },
  1902. X
  1903. X    { "readv",    3,    "dpd",    'd',    sys_readv,    },
  1904. X    { "writev",    3,    "dpd",    'd',    sys_writev,    },
  1905. X    { "settimeofday", 2,    "TZ",    'd',    sys_settimeofday, },
  1906. X    { "fchown",    3,    "ddd",    'd',    generic_fchown,    },
  1907. X    { "fchmod",    2,    "dm",    'd',    generic_fchmod,    },
  1908. X    { "recvfrom",    6,    "dRdNLU", 'd',    sys_recvfrom,    },
  1909. X    { "setreuid",    2,    "dd",    'd',    generic_setreuid,    },
  1910. X    { "setregid",    2,    "dd",    'd',    generic_setregid,    },
  1911. X    { "rename",    2,    "FF",    'd',    generic_rename,    },
  1912. X    { "truncate",    2,    "Fu",    'd',    generic_truncate,    },
  1913. X
  1914. X    { "ftruncate",    2,    "du",    'd',    generic_ftruncate,    },
  1915. X    { "flock",    2,    "dd",    'd',    generic_flock,    },
  1916. X    { "",        0,    "",    '\0',    (int (*)())0,    },
  1917. X    { "sendto",    6,    "dWdNLd", 'd',    sys_sendto,    },
  1918. X    { "shutdown",    2,    "dd",    'd',    generic_shutdown,    },
  1919. X    { "socketpair", 4,    "abcQ",    'd',    generic_socketpair,    },
  1920. X    { "mkdir",    2,    "Fm",    'd',    generic_mkdir,    },
  1921. X    { "rmdir",    1,    "F",    'd',    generic_rmdir,    },
  1922. X    { "utimes",    2,    "FV",    'd',    sys_utimes,    },
  1923. X    { "sigcleanup", 0,    "",    '\0',    (int (*)())0,    },
  1924. X
  1925. X    { "adjtime",    2,    "TT",    'd',    sys_adjtime,    },
  1926. X    { "getpeername", 3,    "dLU",    'd',    generic_getpeername, },
  1927. X    { "gethostid",    0,    "",    'u',    generic_gethostid,    },
  1928. X    { "sethostid",    1,    "u",    'd',    generic_sethostid,    },
  1929. X    { "getrlimit",    2,    "dx",    'd',    sys_getrlimit,    },
  1930. X    { "setrlimit",    2,    "dx",    'd',    sys_setrlimit,    },
  1931. X    { "killpg",    2,    "dK",    'd',    generic_killpg,    },
  1932. X    { "",        0,    "",    '\0',    (int (*)())0,    },
  1933. X    { "Osetquota",    0,    "",    '\0',    (int (*)())0,    },
  1934. X    { "Oquota",    0,    "",    '\0',    (int (*)())0,    },
  1935. X
  1936. X    { "getsockname", 3,    "dLU",    'd',    generic_getsockname, },
  1937. X    { "sysmips",    4,    "dxxx",    'd',    sys_sysmips,    },
  1938. X    { "cacheflush", 3,    "Idd",    'd',    generic_cacheflush,    },
  1939. X    { "cachectl",    3,    "Idd",    'd',    generic_cachectl,    },
  1940. X    { "debug",    0,    "",    '\0',    (int (*)())0,    },
  1941. X    { "",        0,    "",    '\0',    (int (*)())0,    },
  1942. X    { "",        0,    "",    '\0',    (int (*)())0,    },
  1943. X    { "Onfs_mount",    0,    "",    '\0',    (int (*)())0,    },
  1944. X    { "nfssvc",    1,    "d",    'd',    generic_nfssvc,    },
  1945. X    { "getdirentries", 4,    "dRdU",    'd',    generic_getdirentries, },
  1946. X
  1947. X    { "statfs",    2,    "FX",    'd',    sys_statfs,    },
  1948. X    { "fstatfs",    2,    "dX",    'd',    sys_fstatfs,    },
  1949. X    { "unmount",    1,    "F",    'd',    generic_unmount,    },
  1950. X    { "async_daemon", 0,    "",    'd',    generic_async_daemon, },
  1951. X    { "getfh",    0,    "",    '\0',    (int (*)())0,    },
  1952. X    { "getdomainname", 2,    "xd",    'd',    generic_getdomainname, },
  1953. X    { "setdomainname", 2,    "xd",    'd',    generic_setdomainname, },
  1954. X    { "Opcfs_mount", 0,    "",    '\0',    (int (*)())0,    },
  1955. X    { "quotactl",    0,    "",    '\0',    (int (*)())0,    },
  1956. X    { "old_exportfs", 0,    "",    '\0',    (int (*)())0,    },
  1957. X
  1958. X    { "mount",    4,    "FFxp",    'd',    sys_mount,    },
  1959. X    { "hdwconf",    0,    "",    '\0',    (int (*)())0,    },
  1960. X    { "exportfs",    2,    "Fp",    'd',    sys_exportfs,    },
  1961. X    { "nfsfh_open", 0,    "",    '\0',    (int (*)())0,    },
  1962. X    { "libattach",    0,    "",    '\0',    (int (*)())0,    },
  1963. X    { "libdetach",    0,    "",    '\0',    (int (*)())0,    },
  1964. X};
  1965. X
  1966. Xsysentry    *
  1967. Xbsd43_systab_entry(n)
  1968. Xint    n;
  1969. X{
  1970. X    if (n >= 0 && n < nels(bsd43_systab))
  1971. X        return &bsd43_systab[n];
  1972. X
  1973. X    return (sysentry *)0;
  1974. X}
  1975. X
  1976. Xint
  1977. Xbsd43_print_open_flags(arg)
  1978. Xlong    arg;
  1979. X{
  1980. X    need_leading_pipe = 0;
  1981. X
  1982. X    if ((arg & (BSD43_O_WRONLY | BSD43_O_RDWR)) == 0)
  1983. X    {
  1984. X        say_flag(BSD43_O_RDONLY, "O_RDONLY", arg);
  1985. X    }
  1986. X    else
  1987. X    {
  1988. X        say_flag(BSD43_O_WRONLY, "O_WRONLY", arg);
  1989. X        say_flag(BSD43_O_RDWR, "O_RDWR", arg);
  1990. X    }
  1991. X
  1992. X    say_flag(BSD43_O_APPEND, "O_APPEND", arg);
  1993. X    say_flag(BSD43_O_CREAT, "O_CREAT", arg);
  1994. X    say_flag(BSD43_O_EXCL, "O_EXCL", arg);
  1995. X    say_flag(BSD43_O_NDELAY, "O_NDELAY", arg);
  1996. X    say_flag(BSD43_O_TRUNC, "O_TRUNC", arg);
  1997. X
  1998. X    say_residual(arg);
  1999. X
  2000. X    return 0;
  2001. X}
  2002. X
  2003. Xint
  2004. Xbsd43_print_stat(arg)
  2005. Xlong    arg;
  2006. X{
  2007. X    struct bsd43_stat    statbuf;
  2008. X
  2009. X    if (quiet_procmget(GLOBALdipc, (unsigned long)arg, (char *)&statbuf, sizeof(statbuf)) == -1)
  2010. X        return -1;
  2011. X
  2012. X    fprintf(outfp, "{" /* } */ );
  2013. X    fprintf(outfp, "st_dev=0x%x,", statbuf.st_dev);
  2014. X    fprintf(outfp, " st_ino=%d,", statbuf.st_ino);
  2015. X    fprintf(outfp, " st_mode=0x%x,", statbuf.st_mode);
  2016. X    fprintf(outfp, " st_nlink=%d,", statbuf.st_nlink);
  2017. X    fprintf(outfp, " st_uid=%d,", statbuf.st_uid);
  2018. X    fprintf(outfp, " st_gid=%d,", statbuf.st_gid);
  2019. X    fprintf(outfp, " st_rdev=0x%x,", statbuf.st_rdev);
  2020. X    fprintf(outfp, " st_size=%d,", statbuf.st_size);
  2021. X    fprintf(outfp, " st_atime=");
  2022. X    say_time(outfp, statbuf.st_atime);
  2023. X    fprintf(outfp, ",");
  2024. X    fprintf(outfp, " st_mtime=");
  2025. X    say_time(outfp, statbuf.st_mtime);
  2026. X    fprintf(outfp, ",");
  2027. X    fprintf(outfp, " st_ctime=");
  2028. X    say_time(outfp, statbuf.st_ctime);
  2029. X    fprintf(outfp, ",");
  2030. X    fprintf(outfp, " st_blksize=%d,", statbuf.st_blksize);
  2031. X    fprintf(outfp, " st_blocks=%d,", statbuf.st_blocks);
  2032. X    fprintf(outfp, /* { */ "}");
  2033. X
  2034. X    return 0;
  2035. X}
  2036. X
  2037. Xint
  2038. Xbsd43_print_ioctl_cmd(cmd)
  2039. Xunsigned long    cmd;
  2040. X{
  2041. X    switch (cmd)
  2042. X    {
  2043. X    case BSD43_TIOCGETP:
  2044. X        fprintf(outfp, "TIOCGETP");
  2045. X        break;
  2046. X
  2047. X    case BSD43_TIOCSETP:
  2048. X        fprintf(outfp, "TIOCSETP");
  2049. X        break;
  2050. X
  2051. X    case BSD43_TIOCSETN:
  2052. X        fprintf(outfp, "TIOCSETN");
  2053. X        break;
  2054. X
  2055. X    case BSD43_TIOCGWINSZ:
  2056. X        fprintf(outfp, "TIOCGWINSZ");
  2057. X        break;
  2058. X
  2059. X    case BSD43_TIOCLGET:
  2060. X        fprintf(outfp, "TIOCLGET");
  2061. X        break;
  2062. X
  2063. X    case BSD43_TIOCLSET:
  2064. X        fprintf(outfp, "TIOCLSET");
  2065. X        break;
  2066. X
  2067. X    case BSD43_TIOCGETC:
  2068. X        fprintf(outfp, "TIOCGETC");
  2069. X        break;
  2070. X
  2071. X    case BSD43_TIOCSETC:
  2072. X        fprintf(outfp, "TIOCSETC");
  2073. X        break;
  2074. X
  2075. X    case BSD43_TIOCGLTC:
  2076. X        fprintf(outfp, "TIOCGLTC");
  2077. X        break;
  2078. X
  2079. X    case BSD43_TIOCSLTC:
  2080. X        fprintf(outfp, "TIOCSLTC");
  2081. X        break;
  2082. X
  2083. X    case BSD43_FIONBIO:
  2084. X        fprintf(outfp, "FIONBIO");
  2085. X        break;
  2086. X
  2087. X    case BSD43_TIOCGPGRP:
  2088. X        fprintf(outfp, "TIOCGPGRP");
  2089. X        break;
  2090. X
  2091. X    default:
  2092. X        fprintf(outfp, "0x%x", cmd);
  2093. X        break;
  2094. X    }
  2095. X
  2096. X    return 0;
  2097. X}
  2098. X
  2099. Xstatic
  2100. Xint
  2101. Xsay_sgttyb(arg)
  2102. Xunsigned long    arg;
  2103. X{
  2104. X    struct bsd43_sgttyb    sgb;
  2105. X
  2106. X    if (quiet_procmget(GLOBALdipc, arg, (char *)&sgb, sizeof(sgb)) == -1)
  2107. X        return -1;
  2108. X
  2109. X    fprintf
  2110. X    (
  2111. X        outfp,
  2112. X        "{sg_ispeed=%d, sg_ospeed=%d, sg_erase=0x%02x, sg_kill=0x%02x, sg_flags=",
  2113. X        sgb.sg_ispeed & 0xFF,
  2114. X        sgb.sg_ospeed & 0xFF,
  2115. X        sgb.sg_erase & 0xFF,
  2116. X        sgb.sg_kill & 0xFF
  2117. X    );
  2118. X
  2119. X    need_leading_pipe = 0;
  2120. X
  2121. X    say_notflag(BSD43_BSDELAY, "BS0", sgb.sg_flags);
  2122. X    say_flag(BSD43_BS1, "BS1", sgb.sg_flags);
  2123. X    say_notflag(BSD43_VTDELAY, "FF0", sgb.sg_flags);
  2124. X    say_flag(BSD43_FF1, "FF1", sgb.sg_flags);
  2125. X    say_notflag(BSD43_CRDELAY, "CR0", sgb.sg_flags);
  2126. X    say_flag(BSD43_CR3, "CR3", sgb.sg_flags);
  2127. X    say_flag(BSD43_CR2, "CR2", sgb.sg_flags);
  2128. X    say_flag(BSD43_CR1, "CR1", sgb.sg_flags);
  2129. X    say_notflag(BSD43_TBDELAY, "TAB0", sgb.sg_flags);
  2130. X    say_flag(BSD43_XTABS, "XTABS", sgb.sg_flags);
  2131. X    say_flag(BSD43_TAB2, "TAB2", sgb.sg_flags);
  2132. X    say_flag(BSD43_TAB1, "TAB1", sgb.sg_flags);
  2133. X    say_notflag(BSD43_NLDELAY, "NL0", sgb.sg_flags);
  2134. X    say_flag(BSD43_NL3, "NL3", sgb.sg_flags);
  2135. X    say_flag(BSD43_NL2, "NL2", sgb.sg_flags);
  2136. X    say_flag(BSD43_NL1, "NL1", sgb.sg_flags);
  2137. X
  2138. X    say_flag(BSD43_EVENP, "EVENP", sgb.sg_flags);
  2139. X    say_flag(BSD43_ODDP, "ODDP", sgb.sg_flags);
  2140. X    say_flag(BSD43_RAW, "RAW", sgb.sg_flags);
  2141. X    say_flag(BSD43_CRMOD, "CRMOD", sgb.sg_flags);
  2142. X    say_flag(BSD43_ECHO, "ECHO", sgb.sg_flags);
  2143. X    say_flag(BSD43_LCASE, "LCASE", sgb.sg_flags);
  2144. X    say_flag(BSD43_CBREAK, "CBREAK", sgb.sg_flags);
  2145. X    say_flag(BSD43_TANDEM, "TANDEM", sgb.sg_flags);
  2146. X
  2147. X    fprintf(outfp, "}");
  2148. X
  2149. X    return 0;
  2150. X}
  2151. X
  2152. Xstatic
  2153. Xint
  2154. Xsay_lmword(arg)
  2155. Xunsigned long    arg;
  2156. X{
  2157. X    int    local_mode_word;
  2158. X
  2159. X    if (quiet_procmget(GLOBALdipc, arg, (char *)&local_mode_word, sizeof(local_mode_word)) == -1)
  2160. X        return -1;
  2161. X
  2162. X    need_leading_pipe = 0;
  2163. X
  2164. X    say_flag(BSD43_LCRTBS, "LCRTBS", local_mode_word);
  2165. X    say_flag(BSD43_LPRTERA, "LPRTERA", local_mode_word);
  2166. X    say_flag(BSD43_LCRTERA, "LCRTERA", local_mode_word);
  2167. X    say_flag(BSD43_LTILDE, "LTILDE", local_mode_word);
  2168. X    say_flag(BSD43_LMDMBUF, "LMDMBUF", local_mode_word);
  2169. X    say_flag(BSD43_LLITOUT, "LLITOUT", local_mode_word);
  2170. X    say_flag(BSD43_LTOSTOP, "LTOSTOP", local_mode_word);
  2171. X    say_flag(BSD43_LFLUSHO, "LFLUSHO", local_mode_word);
  2172. X    say_flag(BSD43_LNOHANG, "LNOHANG", local_mode_word);
  2173. X#ifndef    BSD43_LETXACK
  2174. X#ifndef    BSD43_ETXACK
  2175. X#define    BSD43_ETXACK    (BSD43_L001000 >> 16)
  2176. X#endif    /* BSD43_ETXACK */
  2177. X#define    BSD43_LETXACK    (BSD43_ETXACK >> 16)
  2178. X#endif    /* BSD43_LETXACK */
  2179. X    say_flag(BSD43_LETXACK, "LETXACK", local_mode_word);
  2180. X    say_flag(BSD43_LCRTKIL, "LCRTKIL", local_mode_word);
  2181. X    say_flag(BSD43_LPASS8, "LPASS8", local_mode_word);
  2182. X    say_flag(BSD43_LCTLECH, "LCTLECH", local_mode_word);
  2183. X    say_flag(BSD43_LPENDIN, "LPENDIN", local_mode_word);
  2184. X    say_flag(BSD43_LDECCTQ, "LDECCTQ", local_mode_word);
  2185. X    say_flag(BSD43_LNOFLSH, "LNOFLSH", local_mode_word);
  2186. X
  2187. X    say_residual(local_mode_word);
  2188. X
  2189. X    return 0;
  2190. X}
  2191. X
  2192. Xstatic
  2193. Xint
  2194. Xsay_ltc(arg)
  2195. Xunsigned long    arg;
  2196. X{
  2197. X    struct bsd43_tchars    tcs;
  2198. X
  2199. X    if (quiet_procmget(GLOBALdipc, arg, (char *)&tcs, sizeof(tcs)) == -1)
  2200. X        return -1;
  2201. X
  2202. X    fprintf(outfp, "{");
  2203. X    fprintf(outfp, "t_intrc=0x%02x, ", tcs.t_intrc);
  2204. X    fprintf(outfp, "t_quitc=0x%02x, ", tcs.t_quitc);
  2205. X    fprintf(outfp, "t_startc=0x%02x, ", tcs.t_startc);
  2206. X    fprintf(outfp, "t_stopc=0x%02x, ", tcs.t_stopc);
  2207. X    fprintf(outfp, "t_eofc=0x%02x, ", tcs.t_eofc);
  2208. X    fprintf(outfp, "t_brkc=0x%02x, ", tcs.t_brkc);
  2209. X    fprintf(outfp, "}");
  2210. X
  2211. X    return 0;
  2212. X}
  2213. X
  2214. Xstatic
  2215. Xint
  2216. Xsay_sltc(arg)
  2217. Xunsigned long    arg;
  2218. X{
  2219. X    struct bsd43_ltchars    ltcs;
  2220. X
  2221. X    if (quiet_procmget(GLOBALdipc, arg, (char *)<cs, sizeof(ltcs)) == -1)
  2222. X        return -1;
  2223. X
  2224. X    fprintf(outfp, "{");
  2225. X    fprintf(outfp, "t_suspc=0x%02x, ", ltcs.t_suspc);
  2226. X    fprintf(outfp, "t_dsuspc=0x%02x, ", ltcs.t_dsuspc);
  2227. X    fprintf(outfp, "t_rprntc=0x%02x, ", ltcs.t_rprntc);
  2228. X    fprintf(outfp, "t_flushc=0x%02x, ", ltcs.t_flushc);
  2229. X    fprintf(outfp, "t_werasc=0x%02x, ", ltcs.t_werasc);
  2230. X    fprintf(outfp, "t_lnextc=0x%02x, ", ltcs.t_lnextc);
  2231. X    fprintf(outfp, "}");
  2232. X
  2233. X    return 0;
  2234. X}
  2235. X
  2236. Xstatic
  2237. Xint
  2238. Xsay_int(arg)
  2239. Xunsigned long    arg;
  2240. X{
  2241. X    int    i;
  2242. X
  2243. X    if (quiet_procmget(GLOBALdipc, arg, (char *)&i, sizeof(i)) == -1)
  2244. X        return -1;
  2245. X
  2246. X    fprintf(outfp, "{");
  2247. X    fprintf(outfp, "i=%d", i);
  2248. X    fprintf(outfp, "}");
  2249. X
  2250. X    return 0;
  2251. X}
  2252. X
  2253. Xstatic
  2254. Xint
  2255. Xsay_winsize(arg)
  2256. Xunsigned long    arg;
  2257. X{
  2258. X    struct bsd43_winsize    w;
  2259. X
  2260. X    if (quiet_procmget(GLOBALdipc, arg, (char *)&w, sizeof(w)) == -1)
  2261. X        return -1;
  2262. X
  2263. X    fprintf(outfp, "{");
  2264. X    fprintf(outfp, "row=%d,", w.ws_row);
  2265. X    fprintf(outfp, "col=%d,", w.ws_col);
  2266. X    fprintf(outfp, "xpixel=%d,", w.ws_xpixel);
  2267. X    fprintf(outfp, "ypixel=%d,", w.ws_ypixel);
  2268. X    fprintf(outfp, "}");
  2269. X
  2270. X    return 0;
  2271. X}
  2272. X
  2273. Xint
  2274. Xbsd43_print_ioctl_arg(args)
  2275. Xunsigned long    *args;
  2276. X{
  2277. X    switch (args[1])
  2278. X    {
  2279. X    case BSD43_TIOCGETP:
  2280. X    case BSD43_TIOCSETN:
  2281. X    case BSD43_TIOCSETP:
  2282. X        if (say_sgttyb(args[2]) == -1)
  2283. X            return -1;
  2284. X        break;
  2285. X
  2286. X    case BSD43_TIOCLGET:
  2287. X    case BSD43_TIOCLSET:
  2288. X        if (say_lmword(args[2]) == -1)
  2289. X            return -1;
  2290. X        break;
  2291. X
  2292. X    case BSD43_TIOCGETC:
  2293. X    case BSD43_TIOCSETC:
  2294. X        if (say_ltc(args[2]) == -1)
  2295. X            return -1;
  2296. X        break;
  2297. X
  2298. X    case BSD43_TIOCGLTC:
  2299. X    case BSD43_TIOCSLTC:
  2300. X        if (say_sltc(args[2]) == -1)
  2301. X            return -1;
  2302. X        break;
  2303. X
  2304. X    case BSD43_FIONBIO:
  2305. X    case BSD43_TIOCGPGRP:
  2306. X        if (say_int(args[2]) == -1)
  2307. X            return -1;
  2308. X        break;
  2309. X
  2310. X    case BSD43_TIOCGWINSZ:
  2311. X        if (say_winsize(args[2]) == -1)
  2312. X            return -1;
  2313. X        break;
  2314. X
  2315. X    default:
  2316. X        fprintf(outfp, "0x%x", args[2]);
  2317. X        break;
  2318. X    }
  2319. X
  2320. X    return 0;
  2321. X}
  2322. X
  2323. Xint
  2324. Xbsd43_print_fdset(nfds, arg)
  2325. Xint        nfds;
  2326. Xunsigned long    arg;
  2327. X{
  2328. X    if (arg == (unsigned long)0)
  2329. X        fprintf(outfp, "0x%x", arg);
  2330. X    else
  2331. X    {
  2332. X        struct bsd43_fd_set    tfds;
  2333. X        int            fd;
  2334. X
  2335. X        if (quiet_procmget(GLOBALdipc, arg, &tfds, sizeof(tfds)) == -1)
  2336. X            return -1;
  2337. X
  2338. X        fprintf(outfp, "{");
  2339. X
  2340. X        for (fd = 0; fd < nfds; fd++)
  2341. X        {
  2342. X            if (BSD43_FD_ISSET(fd, &tfds))
  2343. X                fprintf(outfp, "%d,", fd);
  2344. X        }
  2345. X
  2346. X        fprintf(outfp, "}");
  2347. X    }
  2348. X
  2349. X    return 0;
  2350. X}
  2351. X
  2352. Xint
  2353. Xbsd43_print_whence(arg)
  2354. Xunsigned long    arg;
  2355. X{
  2356. X    switch (arg)
  2357. X    {
  2358. X    case BSD43_L_SET:
  2359. X        fprintf(outfp, "L_SET");
  2360. X        break;
  2361. X
  2362. X    case BSD43_L_INCR:
  2363. X        fprintf(outfp, "L_INCR");
  2364. X        break;
  2365. X
  2366. X    case BSD43_L_XTND:
  2367. X        fprintf(outfp, "L_XTND");
  2368. X        break;
  2369. X
  2370. X    default:
  2371. X        fprintf(outfp, "0x%x", arg);
  2372. X        break;
  2373. X    }
  2374. X
  2375. X    return 0;
  2376. X}
  2377. X
  2378. Xint
  2379. Xbsd43_print_statfs(arg)
  2380. Xunsigned long    arg;
  2381. X{
  2382. X    if (arg == (unsigned long)0)
  2383. X        fprintf(outfp, "0x%x", arg);
  2384. X    else
  2385. X    {
  2386. X        struct bsd43_statfs    t;
  2387. X
  2388. X        if (quiet_procmget(GLOBALdipc, arg, &t, sizeof(t)) == -1)
  2389. X            return -1;
  2390. X
  2391. X        fprintf(outfp, "{");
  2392. X        fprintf(outfp, "type=%d,", t.f_type);
  2393. X        fprintf(outfp, "bsize=%d,", t.f_bsize);
  2394. X        fprintf(outfp, "blocks=%d,", t.f_blocks);
  2395. X        fprintf(outfp, "bfree=%d,", t.f_bfree);
  2396. X        fprintf(outfp, "bavail=%d,", t.f_bavail);
  2397. X        fprintf(outfp, "files=%d,", t.f_files);
  2398. X        fprintf(outfp, "ffree=%d,", t.f_ffree);
  2399. X        fprintf(outfp, "fsid.val[0]=%d,", t.f_fsid.val[0]);
  2400. X        fprintf(outfp, "fsid.val[1]=%d,", t.f_fsid.val[1]);
  2401. X        fprintf(outfp, "}");
  2402. X    }
  2403. X    return 0;
  2404. X}
  2405. X
  2406. Xint
  2407. Xbsd43_print_sigvec(arg)
  2408. Xunsigned long    arg;
  2409. X{
  2410. X    if (arg == (unsigned long)0)
  2411. X        fprintf(outfp, "0x%x", arg);
  2412. X    else
  2413. X    {
  2414. X        struct bsd43_sigvec    t;
  2415. X
  2416. X        if (quiet_procmget(GLOBALdipc, arg, &t, sizeof(t)) == -1)
  2417. X            return -1;
  2418. X
  2419. X        fprintf(outfp, "{");
  2420. X
  2421. X        fprintf(outfp, "handler=");
  2422. X        switch ((int)t.sv_handler)
  2423. X        {
  2424. X        case BSD43_BADSIG:
  2425. X            fprintf(outfp, "BADSIG");
  2426. X            break;
  2427. X
  2428. X        case BSD43_SIG_DFL:
  2429. X            fprintf(outfp, "SIG_DFL");
  2430. X            break;
  2431. X
  2432. X        case BSD43_SIG_IGN:
  2433. X            fprintf(outfp, "SIG_IGN");
  2434. X            break;
  2435. X
  2436. X        default:
  2437. X            fprintf(outfp, "%s", proc_text_address(t.sv_handler));
  2438. X            break;
  2439. X        }
  2440. X        fprintf(outfp, ",");
  2441. X
  2442. X        fprintf(outfp, "mask=%s,", signal_set(t.sv_mask));
  2443. X        fprintf(outfp, "flags={");
  2444. X        need_leading_pipe = 0;
  2445. X        say_flag(BSD43_SV_ONSTACK, "SV_ONSTACK", t.sv_flags);
  2446. X        say_flag(BSD43_SV_INTERRUPT, "SV_INTERRUPT", t.sv_flags);
  2447. X        say_residual(t.sv_flags);
  2448. X        fprintf(outfp, "}");
  2449. X        fprintf(outfp, "}");
  2450. X    }
  2451. X    return 0;
  2452. X}
  2453. X
  2454. Xvoid
  2455. Xbsd43_print_sigcontext(outfp, p)
  2456. XFILE        *outfp;
  2457. Xunsigned long    p;
  2458. X{
  2459. X    fprintf(outfp, "0x%x");
  2460. X}
  2461. END_OF_FILE
  2462. if test 51326 -ne `wc -c <'bsd43.c'`; then
  2463.     echo shar: \"'bsd43.c'\" unpacked with wrong size!
  2464. fi
  2465. # end of 'bsd43.c'
  2466. fi
  2467. echo shar: End of archive 7 \(of 8\).
  2468. cp /dev/null ark7isdone
  2469. MISSING=""
  2470. for I in 1 2 3 4 5 6 7 8 ; do
  2471.     if test ! -f ark${I}isdone ; then
  2472.     MISSING="${MISSING} ${I}"
  2473.     fi
  2474. done
  2475. if test "${MISSING}" = "" ; then
  2476.     echo You have unpacked all 8 archives.
  2477.     rm -f ark[1-9]isdone
  2478. else
  2479.     echo You still need to unpack the following archives:
  2480.     echo "        " ${MISSING}
  2481. fi
  2482. ##  End of shell archive.
  2483. exit 0
  2484.